如何在MATLAB中使用索引来查找函数约束

时间:2016-02-04 14:38:44

标签: matlab

我想返回满足某些条件的元素的索引,它们的索引应该在某些常量AB之间。实现这一目的有一种天真的形式:

inds=find(conditions)
real_inds=find(A<=inds<=B)

但效率很低,实际上我想将搜索范围限制在这些常量之间具有索引的元素,而不是所有元素。

2 个答案:

答案 0 :(得分:4)

如何将自己限制在AB范围内? 假设您有my_vector,并且您希望找到大于0.3且小于0.5的元素(“conditions”)。将自己限制在范围AB只是:

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.1x <= 0.7

代码:

g = 1:length(x);
indices = g((g >= A) & (g <= B) & (x <= 0.7) & (x >= 0.1));

结果:

indices =

 6     9