在 MATLAB 中比较两个矩阵,显示它们的匹配程度
Comparing Two Matrices in MATLAB which shows how much they are matched
请假设 A
是 4 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 == 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
尝试:
sum(sum(A & B))./sum(sum(A))
输出:
ans =
0.8889
要仅获取 B
中存在 1
的不同条目,只需向其添加 &
,这样您将只会获取这些条目。要获得百分比,请取 sum
,其中 A
和 B
是 1
。然后除以 B
中 1
的总和(或 A
中 1
的总和 -> 见下面的注释 ).
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.
请假设 A
是 4 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 == 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
尝试:
sum(sum(A & B))./sum(sum(A))
输出:
ans =
0.8889
要仅获取 B
中存在 1
的不同条目,只需向其添加 &
,这样您将只会获取这些条目。要获得百分比,请取 sum
,其中 A
和 B
是 1
。然后除以 B
中 1
的总和(或 A
中 1
的总和 -> 见下面的注释 ).
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.