2016-09-24 372 views
0

我有以下細胞基質,其將被用作一個混淆矩陣:Matlab-創建細胞混淆矩陣

confusion=cell(25,25); 

然後,我有其他兩個單元陣列,在其上每行包含預測標籤(陣列輸出)和另一個包含真實標籤的單元矩陣(array groundtruth)。

whos output 

Name    Size    Bytes Class Attributes 

output  702250x1    80943902 cell    

whos groundtruth      
    Name     Size    Bytes Class Attributes 

    groundtruth  702250x1    84270000 cell    

然後,我創建了下面的腳本來創建混淆矩陣

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 

但是當我在MATLAB中運行它,我有以下錯誤:

Index exceeds matrix dimensions. 

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

我很好奇,打印輸出和實際值以查看發生了什麼

output{1}                            

ans = 

2 

groundtruth{1}                           

ans = 

1 

所以,沒有什麼似乎是錯誤的值,所以這裏有什麼問題?是代碼中混淆矩陣的索引權?

+0

您只打印出'output'和'groundtruth'的**第一個**值。在循環失敗時,''I''''groundtruth {i}'或'predict {i}'最有可能大於25.在命令提示符中,輸入'dbstop if error',再次運行你的代碼, 'output'和'groundtruth'都在迭代'i',那麼請用你的信息更新你的文章。 – rayryeng

回答

1

該錯誤發生在for循環中。在這種情況下檢查循環的第一次迭代是不夠的。 Index exceeds matrix dimensions意味着存在着的1:size(output,1)範圍爲其中或者groundtruth{i}output{i}是大於25

可以找出哪一個具有至少一個元件比上述範圍更大的i

% 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' 

或者你可以數得過來:

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

也許你也想找到這些元素:

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

順便說一下,我想知道你爲什麼在這種情況下使用單元陣列?爲什麼不是數字數組?