我想返回满足某些条件和的元素的索引,它们的索引应该在某些常量A
和B
之间。实现这一目的有一种天真的形式:
inds=find(conditions)
real_inds=find(A<=inds<=B)
但效率很低,实际上我想将搜索范围限制在这些常量之间具有索引的元素,而不是所有元素。
答案 0 :(得分:4)
如何将自己限制在A
,B
范围内?
假设您有my_vector
,并且您希望找到大于0.3且小于0.5的元素(“conditions
”)。将自己限制在范围A
,B
只是:
masked_ind = find(my_vector(A:B) > 0.3 & my_vector(A:B) < 0.5);
real_ids = masked_ind + A - 1; %// correct the offset induced by `A`.
在conditions
上应用my_vector(A:B)
,您实际上并不关心my_vector
有多大,而您只处理A:B
范围内的元素。
BTW,您是否考虑过按logical indexing建议使用Andras Deak,而不是使用find
和实际线性索引?
%// create a mask to keep indices from A to B only
real_inds_logical = false(size(your_vector));
real_inds_logical(A:B) = (my_vector(A:B)>0.3 & my_vector(A:B)<0.5);
答案 1 :(得分:0)
您可以这样做:
假设您有向量x
,条件:x == 7 or ( x > 3 and x < 5)
并且您希望在A和B之间进行搜索。
现在将向量g
定义为索引的辅助向量:
g = 1:length(x);
然后得到你的指数:
indices = g( (g >= A) & (g <= B) & (conditions) );
在这种情况下,翻译为:
indices = g( (g >= A) & (g <= B) & (x == 7 | (x > 3 & x < 5)) );
这将返回满足extern括号之间条件的g
元素。
示例代码:
初始值:
x = [0.0975 0.2785 0.5469 0.9575 0.9649 0.1576 0.9706 0.9572 0.4854 0.8003];
A = 4;
B = 9;
条件:x >= 0.1
和x <= 0.7
代码:
g = 1:length(x);
indices = g((g >= A) & (g <= B) & (x <= 0.7) & (x >= 0.1));
结果:
indices =
6 9