Search code examples
arraysmatlabmatrixcell-arrayconfusion-matrix

Matlab- Create cell confusion matrix


I have the following cell matrix, which will be used as a confusion matrix:

confusion=cell(25,25);

Then, I have two other cell arrays, on which each line contains predicted labels (array output) and another cell matrix containing the real labels (array groundtruth).

whos output 

 Name             Size               Bytes  Class    Attributes

 output      702250x1             80943902  cell               

whos groundtruth                       
  Name                  Size               Bytes  Class    Attributes

  groundtruth      702250x1             84270000  cell               

Then, I created the following script to create the confusion matrix

function confusion=write_confusion_matrix(predict, groundtruth)

   confusion=cell(25,25);

   for i=1:size(predict,1)
        confusion{groundtruth{i},predict{i}}=confusion{groundtruth{i}, predict{i}}+1;
   end
end

But when I run it in matlab I have the following error:

Index exceeds matrix dimensions.

Error in write_confusion_matrix (line 4)
confusion{groundtruth{i},predict{i}}=confusion{groundtruth{i}, predict{i}}+1;

I was curious to print output's and groundtruth's values to see what was happening

 output{1}                                                                                                              

 ans =

 2

 groundtruth{1}                                                                                                         

 ans =

 1

So, nothing seems to be wrong with the values, so what is wrong here? is the confusion matrix's indexing right in the code?


Solution

  • The error occurs in a for loop. Checking the first iteration of the loop is not sufficient in this case. Index exceeds matrix dimensions means there exists an i in the range of 1:size(output,1) for which either groundtruth{i} or output{i} is greater than 25.

    You can find out which one has at least one element bigger than the range:

    % 0 means no, there is none above 25. 1 means yes, there exists at least one:
    hasoutlier = any(cellfun(@(x) x > 25, groundtruth)) % similar for 'output'
    

    Or you can count them:

    outliercount = sum(cellfun(@(x) x > 25, groundtruth))
    

    Maybe you also want to find these elements:

    outlierindex = find(cellfun(@(x) x > 25, groundtruth))
    

    By the way, I am wondering why are you working with cell arrays in this case? Why not numeric arrays?