检查矩阵的所有行是否在数值上相等的最有效方法是什么? 最好在没有for循环的情况下寻找一些东西。
答案 0 :(得分:5)
使用 diff(..,1)
找出columns
的连续元素之间的差异,然后检测所有这些差异是否为 nnz(..)==0
为零,给我们一个简单易玩的单线和非常有效的解决方案 -
isallrowsequal = nnz(diff(A,1))==0 %// A is input matrix
答案 1 :(得分:4)
您可以选择:所有行的所有组件是否与第一行相同?
allRowsEqual = all(all(bsxfun(@eq, A, A(1,:))));
另一方面,使用简单的for
循环可能会更快,因为上面必须查看整个矩阵......
allRowsEqual = true;
for k = 1:size(A,1)
if any(A(k,:)~=A(1,:))
allRowsEqual = false;
break;
end
end
如果你想要清楚,这个基本上是:只有一个独特的行吗?
allRowsEqual = size(unique(A,'rows'),1)==1;
答案 2 :(得分:1)
我建议的另一种方法是使用ismember
,并检查结果向量中的所有值是否为1
:
allRowsEqual = all(ismember(A, A(1,:), 'rows'));
ismember
对rows
标志的工作原理是,这将输出logical
向量,其中1
表示与A
匹配的行A(1,:)
A
(或0
的第一行)和logical
。要确保所有行都相同,您只需检查此1
向量中的所有值是否为{{1}},如果是这样,那么您的每一行都是如此矩阵彼此相等。
答案 3 :(得分:0)
你可以这样检查一下,例如:
假设您有两个矩阵a和b;
a =
1 2 3
4 5 6
7 8 9
b =
1 4 7
2 5 8
3 6 9
您可以使用"检查相应的行是否相等总和" :
sum(a-b)
ans =
6 0 -6
但如果你尝试两个相等的那个,那么你得到的结果向量的所有列都等于零:
sum(a-a)
ans =
0 0 0
然后你可以检查结果向量是否等于相同大小的零向量。