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

Matlab 如何检查矩阵的所有行是否相等,matlab,matrix,vectorization,Matlab,Matrix,Vectorization,检查矩阵的所有行在数值上是否相等的最有效方法是什么? 最好是寻找没有for循环的东西。你可以选择:所有行的所有组件都等于第一行吗 另一方面,使用简单的for循环可能会更快,因为上面需要查看整个矩阵 allRowsEqual = true; for k = 1:size(A,1) if any(A(k,:)~=A(1,:)) allRowsEqual = false; break; end end 如果你想说清楚,这一行基本上是这样的:只有一行吗

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

你可以选择:所有行的所有组件都等于第一行吗

另一方面,使用简单的
for
循环可能会更快,因为上面需要查看整个矩阵

allRowsEqual = true;
for k = 1:size(A,1)
    if any(A(k,:)~=A(1,:))
        allRowsEqual = false;
        break;
    end
end
如果你想说清楚,这一行基本上是这样的:只有一行吗


我建议的另一种方法是使用,并检查结果向量中的所有值是否为
1

allRowsEqual = all(ismember(A, A(1,:), 'rows'));

ismember
标志的作用是,它将输出一个
逻辑
向量,其中
1
将表示与
a(1,:)
(或
a
的第一行)匹配的
a
行,否则表示
0
。为了确保所有行都相同,您只需检查此
逻辑
向量中的所有值是否都是
1
,如果是这样,然后,矩阵中的每一行都是相等的。

使用查找跨
的连续元素之间的差异,然后使用检测所有这些差异是否为零,这为我们提供了一个简单的皮斯棋盘式单线图和非常有效的解决方案-

isallrowsequal = nnz(diff(A,1))==0                      %// A is input matrix

您可以这样检查,例如:

假设你有两个矩阵a和b

a =

 1     2     3
 4     5     6
 7     8     9

b =

 1     4     7
 2     5     8
 3     6     9
您可以使用“总和”检查对应的行是否相等:

但是如果你尝试两个相等的向量,那么得到的向量的所有列都等于零:

sum(a-a)

ans =

 0     0     0

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

@hagubear类似,但不同。这个答案没有经过修改就不能回答这个问题。@James-我发现这个被接受的答案就是你在重复链接中寻找的答案。你只需要做一个额外的步骤,检查结果向量中的所有值是否都是
true
。这也是我应该做的+1完美,把工作做好+1这将产生大量误报!说:
A=[0,0;0,0]
B=[1,1;-1,-1]
。它们并不相等,但仍然给出
[0]
。如果你真的想用这种方式比较两个矩阵,你必须使用:
sum(abs(a-b))
,或者更好的方法:
sum(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