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

Performance 在MATLAB中比较两个矩阵,显示它们的匹配程度,performance,matlab,matrix,comparison,Performance,Matlab,Matrix,Comparison,请假定A是4 x 4的矩阵,其具有: A = 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 0 而B是一个参考矩阵(4x4),它是: B = 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 现在,如果将A与

请假定
A
4 x 4
的矩阵,其具有:

A =  1     0     1     0
     1     0     1     0
     1     1     1     0
     1     1     0     0 
B
是一个参考矩阵(
4x4
),它是:

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 1 0

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

最后,我们正在寻找一段代码,它可以显示
a
中的成员与
B
中的成员相等的百分比。在这种情况下,区别是:

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


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

如果我答对了,你想知道的是
B==1
A==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
尝试:

输出:

ans =

    0.8889

要仅获取在
B
中有
1
的不同条目,只需将
&
添加到其中,即可仅获取这些条目。要获得百分比,请取
总和
,其中
A
B
1
。然后除以
B
中的
1
之和(或
A
->中的
1
之和,见下面的注释)

结果是:


编辑/注意:在OP的问题中,他是否想要与
A
B
中的数字之和相关的百分比还不是100%清楚。我假设它是参考矩阵的一个百分比,即
B
。因此我除以总和(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.

我们是谁?那是集体作业吗?首先展示您迄今为止所做的尝试。在您的问题中,不清楚百分比是否是相对于
a
B
中的百分比。我假设它是参考矩阵的一个百分比,即
B
。因此我除以总和(B(:)。你能澄清一下吗,这样我就可以在需要时更改代码了?@Matt非常感谢。你是格兰特。这正是我想要的。在百分比公式中,除以
sum(B(:)
是错误的。OP想知道A中
的百分比,因此宇宙是
A
。你应该除以
sum(A(:)
(看我的答案)。@RafaelMonteiro据我所知,他想知道
A
中匹配的值相对于参考矩阵
B
的百分比。但他并不是百分之百的明确,这个例子也可能模棱两可。我对他的问题留下了评论,这样他就可以澄清这一点。@RafaelMonteiro:正如OP在对他的问题的评论中所说的,我用
sum(B(:)
的回答是正确的。无论如何,我还是添加了一个注释来涵盖这两种情况,因为我承认这很混乱。@jucestain:正如OP在对他的问题的评论中所说,我用
sum(B(:)
的答案是正确的。无论如何,我还是添加了一个注释来涵盖这两种情况,因为我承认这很混乱。@Matt一段代码可以显示
a
中有多少百分比的成员与
B
中的成员相等。很明显,这是相对于A的百分比,但如果他说你是对的,那么问题就错了。OP只想在B不为零的情况下使用。总体而言,你的方法更快、更清晰。干得好然而,我不知道我应该选择你的答案作为最终解决方案还是另一个,因为他是第一个。再次感谢您抽出时间。我在代码中使用你的。
percentage_wrtA = A(:).'*B(:)/sum(A(:)) * 100;
percentage_wrtB = A(:).'*B(:)/sum(B(:)) * 100;
>> 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.