【问题标题】:Compare two vectors of same size in MATLAB在MATLAB中比较两个相同大小的向量
【发布时间】:2015-10-28 10:53:19
【问题描述】:

我需要编写一个代码来比较两个相同大小的向量——一个包含参考值,另一个在一些分类过程后获得值——并生成一个置信矩阵,该矩阵显示哪些元素以及有多少它们被错误分类。 假设向量是: 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] 怎么做? 谢谢

【问题讨论】:

  • 置信矩阵的公式是什么?你是怎么计算的?
  • 我仍然不知道如何计算置信矩阵。
  • 没关系。我得到它。每对ref/obt 值都是访问置信矩阵所需的行/列对。每次看到此行/列对时,您都会计算在此矩阵中看到的计数。将来,请提供有关将来如何计算此矩阵的说明。尝试猜测或推断您要询问的内容不是我们的工作。我们帮助您解决问题,但为了做到这一点,您必须尽可能多地让我们了解您的问题。

标签: arrays matlab matrix


【解决方案1】:

让我们使用accumarray和bsxfun:

  • 如果可能的值始终采用1、2、3、...的形式:

    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) 的次数。

【讨论】:

  • 非常感谢。它完美地工作。但是有没有更简单的方法可以做到这一点?我是 MATLAB 的新手,不幸的是你的代码对我来说有点难以理解。我感觉带有 'length' 和 'find' 的 for 循环也可以,但我想不通。
  • @NewProg 当然可以用循环来完成,这对于Matlab初学者来说更容易理解。您的值是否始终采用 1、2、3、...的形式?
  • 我试图通过选择更短的向量和更少的类来简化我的问题。其实都是0到9的数字,向量的维度是60000X1。
  • @IKavanagh 实际上,我在两个版本之间混合了变量。感谢您的编辑!
【解决方案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 中的 for 循环通常不是一个好主意。如果你打算经常使用 matlab,你应该使用向量化。

将此作为入门者http://es.mathworks.com/help/matlab/matlab_prog/vectorization.html

【讨论】:

  • 非常感谢,这对我来说似乎更容易理解。
【解决方案3】:

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

>> confusionmat(ref, obt)
ans =

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

【讨论】:

  • 值得一提的是,confusionmat 是统计和机器学习工具箱的一部分。
  • 完美!但是在 MATLAB 中如何知道这些函数呢?
猜你喜欢
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多