Merge confusion matrices in nice, vectorized way.

4 visualizaciones (últimos 30 días)
Adriano
Adriano el 23 de Ag. de 2011
Hello everyone,
I have several confusion matrices, which are a 2D cell array. The first row and the first columns are strings. The rest are numbers. Something like this:
MATRIX 1
A B C
A 100 10 15
B 20 150 25
C 10 10 200
MATRIX 2
A B D
A 150 5 10
B 10 100 15
D 15 15 100
MATRIX 3
B E
B 100 15
E 5 150
How can I merge the matrices in a vectorized way so the output is something like this?
DESIRED OUTPUT
A B C D E
A 250 15 15 10 0
B 30 350 25 15 15
C 10 10 200 0 0
D 15 15 0 100 0
E 0 5 0 0 150
Which means merge all the matrices into one, including the labels in the first row and the first column label. Where the rows and columns overlap, add them. I could do this with some loops, but I am interested in the nice, vectorized way :) .

Respuesta aceptada

Oleg Komarov
Oleg Komarov el 23 de Ag. de 2011
m1 = {'' 'A' 'B' 'C'
'A' 100 10 15
'B' 20 150 25
'C' 10 10 200};
m2 = {'' 'A' 'B' 'D'
'A' 150 5 10
'B' 10 100 15
'D' 15 15 100};
m3 = {'' 'B' 'E'
'B' 100 15
'E' 5 150};
m = [unPivot(m1); unPivot(m2); unPivot(m3)];
Pivot(m,@sum,[],0)
ans =
[NaN] 'A' 'B' 'C' 'D' 'E'
'A' [250] [ 15] [ 15] [ 10] [ 0]
'B' [ 30] [350] [ 25] [ 15] [ 15]
'C' [ 10] [ 10] [200] [ 0] [ 0]
'D' [ 15] [ 15] [ 0] [100] [ 0]
'E' [ 0] [ 5] [ 0] [ 0] [150]
One suggestion, using text labels is highly inefficient because the resulting cell array will be very memory demanding. Convert the labels to numbers 1 2 3 ... and you'll see the difference.

Más respuestas (1)

Kelly Kearney
Kelly Kearney el 23 de Ag. de 2011
You might want to add a loop over the columns if your matrices will be varying sizes, but otherwise...
Your data:
m{1} = {...
'rowA.' 1 2 3
'rowB.' 1 2 3
'rowC.' 1 2 3};
m{2} = {...
'rowA.' 2 3 4
'rowD.' 2 3 4
'rowE.' 2 3 4};
m{3} = {...
'rowD.' 3 4 5
'rowF.' 3 4 5};
Combine matrices into one...
mall = cat(1, m{:});
lbl = mall(:,1);
data = cell2mat(mall(:,2:end));
... and sum by label:
[lbl, blah, idx] = unique(lbl);
data = [accumarray(idx, data(:,1)) ...
accumarray(idx, data(:,2)) ...
accumarray(idx, data(:,3))];
  2 comentarios
Kelly Kearney
Kelly Kearney el 23 de Ag. de 2011
Hey, you changed your question and example completely while I was typing my answer!
Adriano
Adriano el 23 de Ag. de 2011
Sorry, my mistake, I hadn't realized the real problem :-(

Iniciar sesión para comentar.

Categorías

Más información sobre Data Preprocessing en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by