在MATLAB

时间:2015-10-28 10:53:20

标签: arrays matlab matrix

我需要编写一个代码,用于比较两个向量 - 一个包含参考值,另一个在一些分类过程后获得的值 - 具有相同的大小,并生成一个置信矩阵,显示哪些元素,以及多少个他们被错误分类。 让我们说这些载体是:  ref = [3;3;3;4;4;2;1;3]和  obt = [4;2;3;1;1;3;4;3] 我希望置信度矩阵为:[0 0 0 1; 0 0 1 0;0 1 2 1 ;2 0 0 0] 怎么做? 感谢

3 个答案:

答案 0 :(得分:3)

让我们使用accumarraybsxfun

  • 如果可能的值始终为123,... 形式:

    ref = [3;3;3;4;4;2;1;3]; %// original values
    obt = [4;2;3;1;1;3;4;3]; %// what the original values have been classified as
    
    vals = 1:max([ref(:) obt(:)]); %// all possible values
    result = accumarray([ref(:) obt(:)],1);
    
  • 如果值是任意的

    obt = [.1 .1 5.4 5.4 3 2.2 2.2]; %// original values
    ref = [.1 2.2 2.2 5.4 5.4 3 3]; %// what the original values have been classified as
    
    vals = unique([ref(:);obt(:)]); %// all existing values
    [~, refv] = max(bsxfun(@eq, ref(:).', vals(:)));
    [~, obtv] = max(bsxfun(@eq, obt(:).', vals(:)));
    result = accumarray([refv(:) obtv(:)],1);
    

输入向量可以是行或列可互换。

vals包含所有可能的值(示例中为[1 2 3 4])。 result(m,n)表示vals(m)被归类为vals(m) 的次数。

答案 1 :(得分:2)

num_classes = max([ref;obt]);
mat_classes = zeros(num_classes);

for i = 1:length(ref)
    mat_classes(ref(i),obt(i)) = mat_classes(ref(i),obt(i))+1
end

这应该以更简单的方式做你想做的事。

这比Luis Mendo的回应效率低得多。对于matlab中的循环通常不是一个好主意。如果你打算经常使用matlab,你应该使用矢量化。

将其设为启动器http://es.mathworks.com/help/matlab/matlab_prog/vectorization.html

答案 2 :(得分:2)

你想要一个confusion matrix。使用Matlab的confusionmat函数:

>> confusionmat(ref, obt)
ans =

     0     0     0     1
     0     0     1     0
     0     1     2     1
     2     0     0     0