如何检查矩阵的所有行是否相等

时间:2014-12-17 21:42:09

标签: matlab matrix vectorization

检查矩阵的所有行是否在数值上相等的最有效方法是什么? 最好在没有for循环的情况下寻找一些东西。

4 个答案:

答案 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'));

ismemberrows标志的工作原理是,这将输出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

然后你可以检查结果向量是否等于相同大小的零向量。