Matlab 比较两个向量是否相同

Matlab 比较两个向量是否相同,matlab,vector,compare,Matlab,Vector,Compare,如何检查两个向量是否相同?我曾尝试使用for循环和if语句来实现这一点,但该选项不适合我需要处理的数据量。有什么聪明的方法吗?我想创建一个if语句,如果我的矩阵中没有特定的向量,它只向矩阵中添加一个特定的向量 例如,如果我的矩阵中有一个向量[1 2 3 1 2],我不想再向矩阵中添加另一个向量[1 2 3 1 2]。只需检查两个向量是否相等,就可以对向量使用=操作符,然后使用all()检查返回的逻辑数组的每个元素是否为真。评论中的Andras Deak link有一些在更大集合中找到向量的好方法

如何检查两个向量是否相同?我曾尝试使用
for
循环和
if
语句来实现这一点,但该选项不适合我需要处理的数据量。有什么聪明的方法吗?我想创建一个
if
语句,如果我的矩阵中没有特定的向量,它只向矩阵中添加一个特定的向量


例如,如果我的矩阵中有一个向量
[1 2 3 1 2]
,我不想再向矩阵中添加另一个向量
[1 2 3 1 2]

只需检查两个向量是否相等,就可以对向量使用
=
操作符,然后使用
all()
检查返回的逻辑数组的每个元素是否为真。评论中的Andras Deak link有一些在更大集合中找到向量的好方法

v1 = [1 2 3 1 2];
v2 = [1 2 3 1 2];
returnsTrue = all(v1 == v2);

关于比较两个向量的问题,您可以使用:

但据我所知,每个向量(
vec
)将成为最终矩阵(
Mat
)中的一行,并且您希望保持
Mat
的行唯一。如果是这样,这里有两种方法:

首先是在添加行之前进行检查。用于此目的:

tf = ismember(vec, Mat, 'rows'); % it gives you true if vec is a row in Mat
或者,您可以插入所有向量而不进行检查,并在最后收集行:

我应该选择哪一个


如果您有一个大的
Mat
和/或您想在其中添加许多
vec
s,则此问题是相关的。在这种情况下,如果
vec
很可能已经是
Mat
中的一行,比如当元素只能是有限范围内的整数时,第二种方法可能会导致在
unique
之前出现非常大的
Mat
,因此我不建议这样做。否则,第二种方法更方便。

您也可以使用等质量函数

A1 = [1 5 6];
A2 = [1 4 3];
A3 = [1 1 1];

result = isequal(A1,A2,A3)

但如果其中一个元素为NAN,则isequal始终返回0(false)

在比较浮点数时,不应使用
=
。出于数字原因,您应该使用
all(abs(v1-v2)@erfan公认的答案是“
ismember(M,v,'rows')
”。您不认为
any(ismember(M,v,'rows'))
这将是一个合适的解决方案?如果你能找到索引,你可以测试发生率。就像你在这里的答案所说的那样。至少不要假装这不是一个明显的骗局。@AndrasDeak是的,我在这里的部分答案与那里的答案相似,但据我所知,骗局是关于问题,而不是答案。OP实际上问的可能是一个问题回答了
isequal
,仅此而已。也与相关问题无关。但如果我们注意问题的细节,那么要解释的内容比解释的内容(以及解释得好的内容)更多在链接的问题中。@erfan对重复的问题进行过度分析并不总是有建设性的,只要经过投票/接受的答案能够以最少的额外大脑功能解决问题。在像这样的简单问题中,一个合适的重复可以防止低质量的答案像蘑菇一样突然出现……这也是这里发生的部分原因。我相信链接副本的
ismember
解决了OP的XY问题(X=“判断一个矩阵是否包含一个向量”,Y=“如何测试两个向量的相等性?”)。什么对未来的读者有用我们在这里讨论的部分是基于意见,部分是基于惯例和经验。在第二个问题上,我完全依赖你的意见,因为你比我更有经验。如果我听起来也一样,请原谅我的话bold@erfan不,别担心,我也不容易生气。我只是不同意我同意你的意见,并想详细说明我自己:)我们可以继续不同意,这没什么错。找到角落案例的方法!
Mat = unique(Mat, 'rows');
A1 = [1 5 6];
A2 = [1 4 3];
A3 = [1 1 1];

result = isequal(A1,A2,A3)