我需要循环遍历矩阵的第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
但没有工作。
答案 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)
这是一个没有循环的解决方案,并且对要比较的矢量没有任何条件。给定两个向量a
和b
,此代码将找到最小的索引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
。idx = max(Loca)
则是此索引列表中的最高索引,因此是b
中找到a(1:idx)
的所有元素的最小索引。all(Loca)
最后检查Loca
中的所有索引是否都为非零,即b
中是否找到a
的所有元素。