我在使用Matlab避免循环时遇到了麻烦。我被告知循环导致性能不佳所以我正在重新编写已经使用循环的代码。
我有一个包含值的向量大向量x和一个包含值的小X.对于每个值x,我必须知道它在哪个区间。我将第i个间隔定义为X_i-1和X_i之间的值。现在,我这样做:
len = length(x);
is = zeros(len, 1); % Interval for each x
for j=1:len
i=1; % Start interval
while(x(j)<X(i-1) || x(j)>X(i)) % Please consider accessing X(0) won't crash it's a simplification to make the code clearer for you.
i = i + 1;
end
is(j) = i;
end
如果没有这些循环,这样做的方法是什么?
编辑:为了帮助您了解情况,这里是我在这里尝试做的一个真实的例子。有了这些输入
X = [1 3 4 5]
x = [1 1.5 3.6 4.7 2.25]
我希望is
成为
% The 2 first and the 5th are in the first interval [1, 3]
% The 3rd is in [3, 4] and the 4th is in [4, 5]
is = [1 1 2 3 1]
答案 0 :(得分:4)
明显的家庭作业,所以我只想指出两个可能对你有帮助的功能:
如果您的间隔列表具有恒定间距,请查看floor
并了解如何直接计算索引。
如果间隔是不规则的间隔,请查看histc
,特别是查看带有2个输出参数的表单。
您的示例代码还有一个问题:尝试了解当x(j)
超出任何时间间隔时会发生什么。
答案 1 :(得分:0)
我正在使用蒙版,然后移动第二个蒙版,然后使用find
返回索引:
ranges = [1,2,3,4]; %<br>
a = 1.5; %<br>
m1 = (a >= ranges); % will be [1, 0, 0, 0] <br>
m2 = (a <= ranges); % will be [0, 1, 1, 1] <br>
m2(1:end-1) = m2(2:end); % will be [1, 1, 1, 1], I am trying to shift this mask <br>
m2(end) = 0; % will be [1, 1, 1, 0], the mask shift is completed <br>
b = find( m1 & m2); % this will return 1 so your value is between 1 and 2 <br>