Merge confusion matrices in nice, vectorized way.
4 views (last 30 days)
Show older comments
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 :) .
0 Comments
Accepted Answer
Oleg Komarov
on 23 Aug 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.
0 Comments
More Answers (1)
Kelly Kearney
on 23 Aug 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 Comments
Kelly Kearney
on 23 Aug 2011
Hey, you changed your question and example completely while I was typing my answer!
See Also
Categories
Find more on Data Preprocessing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!