检查向量的所有元素是否在另一个向量中

时间:2015-04-09 13:25:50

标签: arrays matlab

我需要循环遍历矩阵的第1列并返回(i)当我遇到另一个我可以预定义的向量的所有元素时。

check_vector = [1:43] %% I dont actually need to predefine this - i know I am looking for the numbers 1 to 43. 

matrix_a coloumn 1(这是我唯一感兴趣的coloumn,例如

1 4 3 五 6 7 8 9 10 11 12 13 14 16 15 18 17 19 20 21 22 23 24 25 26 27 28 29 三十 31 32 33 34 35 36 37 38 39 40 41 42 43 1 3 4 2 6 7 8

当我们击中1到43范围内的所有数字时,我们想循环遍历matrix_a并返回(i)的值。 在上面的例子中,我们正在查找从1到43的所有数字,迭代将在matrix_a中关于位置47结束,因为此时我们命中了数字' 2'这是完成序列1到43中所有数字的最后一个数字。 如果我们在途中遇到一个数字并不重要,我们会计算所有这些数字 - 我们只想知道何时从检查向量或本例中的序列1到43中达到所有数字。

我尝过类似的事情:

completed = []
for i = 1:43
  complete(i) = find(matrix_a(:,1) == i,1,'first')
end

但没有工作。

4 个答案:

答案 0 :(得分:2)

假设A为输入列向量,可以在这里建议两种方法。

方法#1

使用arrayfun -

check_vector = [1:43]
idx = find(arrayfun(@(n) all(ismember(check_vector,A(1:n))),1:numel(A)),1)+1

给出 -

idx =
    47

方法#2

习惯bsxfun -

check_vector = [1:43]
idx = find(all(cumsum(bsxfun(@eq,A(:),check_vector),1)~=0,2),1)+1

答案 1 :(得分:1)

要查找第一个条目 matrix_a的所有唯一值 已经已经出现(即,如果{{ 1}}由check_vector)的所有唯一值组成:unique函数几乎给出了答案:

matrix_a

答案 2 :(得分:0)

有人可能会有一个更紧凑的答案,但这是你的追求吗?

maxIndex = 0;
for ii=1:length(a)
  [f,index] = ismember(ii,a);
  maxIndex=max(maxIndex,max(index));
end
maxIndex

答案 3 :(得分:0)

这是一个没有循环的解决方案,并且对要比较的矢量没有任何条件。给定两个向量ab,此代码将找到最小的索引idx,其中a(1:idx)包含b的所有元素。如果idx中未包含b,则a将为0。

a = [ 1 4 3 5 6 7 8 9 10 11 12 13 14 16 15 18 17 19 20 21 22 23 24 25 26 ...
    27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 1 3 4 2 6 7 8 50];
b = 1:43;

[~, Loca] = ismember(b,a);
idx = max(Loca) * all(Loca);

一些细节:

  • ismember(b,a)检查是否可以在b中找到a的所有元素,输出Loca列出a中这些元素的索引。如果在a
  • 中找不到该元素,则索引将为0
  • idx = max(Loca)则是此索引列表中的最高索引,因此是b中找到a(1:idx)的所有元素的最小索引。
  • all(Loca)最后检查Loca中的所有索引是否都为非零,即b中是否找到a的所有元素。