在 MATLAB 中比较两个矩阵,显示它们的匹配程度

Comparing Two Matrices in MATLAB which shows how much they are matched

请假设 A4 x 4 的矩阵,其中有:

A =  1     0     1     0
     1     0     1     0
     1     1     1     0
     1     1     0     0 

B是一个参考矩阵(4 x 4)即:

B =  1     0     1     0
     1     0     1     0
     1     0     1     0
     1     1     1     0 

现在,如果将 A 与作为参考矩阵的 B 进行比较,通过匹配这两个矩阵,几乎所有成员都相等,除了 A(4,3)A(3,2).但是,由于 B 是参考矩阵,而 A 与参考矩阵进行比较,因此只有那些成员的差异才是 B 中的 1。在这个特定的例子中,A(4,3) 只是问题,而不是 A(3,2),意思是:

>> C = B ~= A; ans = 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0

A(4,3) ~= B(4,3)

最后,我们正在寻找一段代码,它可以显示 A 中有多少百分比等于它们在 B 中的等效成员。在这种情况下,差异是:

(8 / 9) * 100 = 88.89 % 匹配。

请记住速度在这里也很重要。因此,更快的解决方案更受欢迎。谢谢。

如果我没记错的话,你想知道的是 B == 1A == 0 在哪里。 试试这个:

>> C = B & ~A

C =

     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     1     0

要获得百分比,您可以试试这个:

>> 100 * sum(A(:) & B(:)) / sum(A(:))
ans =

    88.8889

尝试:

sum(sum(A & B))./sum(sum(A))

输出:

ans =

    0.8889

要仅获取 B 中存在 1 的不同条目,只需向其添加 &,这样您将只会获取这些条目。要获得百分比,请取 sum,其中 AB1。然后除以 B1 的总和(或 A1 的总和 -> 见下面的注释 ).

A = [1 0 1 0;
     1 0 1 0;
     1 1 1 0;
     1 1 0 0];

B = [1 0 1 0;
     1 0 1 0;
     1 0 1 0;
     1 1 1 0];

C = (B ~= A) & B

p = sum(B(:) & A(:)) / sum(B(:)) * 100

这是结果:

C =
     0     0     0     0
     0     0     0     0
     0     0     0     0
     0     0     1     0
p =
   88.8889

编辑/注意: 在 OP 的问题中,如果他想要相对于 A 或 [=14 中的总和的百分比,则不是 100% 清楚=].我假设它是参考矩阵的百分比,即 B。因此我除以 sum(B(:))。如果您需要参考 A 中的内容,只需将最后一行更改为:

p = sum(B(:) & A(:)) / sum(A(:)) * 100

您可以使用矩阵乘法,它一定非常高效,如下所列。

获取相对于A-

的百分比值
percentage_wrtA = A(:).'*B(:)/sum(A(:)) * 100;

获取相对于B-

的百分比值
percentage_wrtB = A(:).'*B(:)/sum(B(:)) * 100;

运行时测试

这里有一些快速的运行时测试,用于比较矩阵乘法与 (:)ANDing -

的元素求和
>> M = 6000;  %// Datasize
>> A = randi([0,1],M,M);
>> B = randi([0,1],M,M);
>> tic,sum(B(:) & A(:));toc
Elapsed time is 0.500149 seconds.
>> tic,A(:).'*B(:);toc
Elapsed time is 0.126881 seconds.