如何同时检查相同的向量?

时间:2014-03-04 07:36:17

标签: matlab

尝试检查相同的向量。目前使用isequal函数检查相同的函数。

它像这样运行。
if isequal (vectorA, vectorB) == 0
 然后它会运行一条指令 end

if isequal (vectorA, vectorB) == 1
 它会运行另一条指令 end

我现在有一组从A到F的向量。无论如何要检查所有这些(B,C,D,F)与Vector A并做同样的事情?

含义
if vectorA matches any of B,C,D,F == 0

与第二种情况相同  if vectorA matches any of B,C,D,F == 1

向量不断变化,这是在循环中运行以检查相同的向量。似乎isequal函数仅适用于2个向量之间 所有向量都是1xi其中i can be a number up to 50
对此的任何帮助都会非常令人沮丧!

3 个答案:

答案 0 :(得分:2)

我建议你将其他矢量保存在矩阵中,而不是像:

a = vectorA;
B = [vectorB, vectorC, vectorD, vectorE];

然后只使用一个简单的for循环:

flag = false;
for k = 1:size(B,2)
    flag = flag || isequal(a,B(:,k));
    if flag 
        break
    end;
end

或者如果你喜欢在循环中使用一个完全复杂的单行(但在这种情况下,我怀疑循环中的早期退出子句实际上可能提供性能优势,但取决于你的数据):

flag = any(all(bsxfun(@eq,a,B)))

然后

if flag
    %// do stuff if any was equal
else
    %// Do stuff if none were equal to a

顺便说一句,如果你想检查一下 ALL 是否匹配,而不是 ANY 匹配,那么请改为:

flag = all(all(bsxfun(@eq,a,B)))

或在循环中更改为

flag = true;
for k = 1:size(B,2)
    flag = flag && isequal(a,B(:,k));
    if ~flag 
        break
    end;
end

答案 1 :(得分:1)

这可以通过ismember轻松完成:

检查矢量是否与任何行匹配:

v = 1:3
M = [1:3;2:4;3:5]

ismember(v,M,'rows')

要检查它是否与所有行匹配,您可以通过检查以下内容来扩展它:

size(unique(M,'rows'),1)==1

这假设向量堆叠在彼此之下,但当然可以很容易地调整它们以匹配它们彼此相邻时的情况。

答案 2 :(得分:0)

要检查A是否等于BCDF(可能大小不同),请使用cellfun在包含您的向量的单元格数组上:

if any(cellfun(@(x) isequal(A,x), {B,C,D,F}))

如果所有向量都是具有相同数字列的行向量,则在包含向量的矩阵上使用bsxfun可能会更快:

if any(all(bsxfun(@eq, A, [B; C; D; F]).'))