我试图消除MATLAB中的以下循环,该循环找到向量位于其间的索引。由于我是通过循环执行此计算的,因此需要花费非常长的时间(最多20分钟)来运行,并且我需要非常频繁地运行它。
MATLAB代码:
% Clear window and variables
clc;
clear;
% Input Arrays
x = [0 0.5 0.51 0.49999 1]
xi= [0.25 0.47 .9 0.4]
% Create empty array
pos = double.empty;
% Find indices
for j = 1:length(xi)
for k=1:length(x)-1
if ( (x(k) <= xi(j)) && (xi(j) < x(k+1)) )
pos = cat(2,pos,k);
break;
end
end
end
pos
此循环将返回x的索引或x的边,即xi的值位于它们之间。我正在使用此循环来近似线性插值的硬件实现,因此我不想使用MATLAB中的任何内置线性插值函数。我知道我可以使用histc()函数查找边缘,但是我不想使用看不到源代码并无法在硬件中实现的任何内置函数。我需要一些更简单的方法。
我尝试将代码分为while循环和for循环,但该代码仍无法快速运行。
x是一个大小为4000x1的向量,由于量化误差而不一定按顺序排列。这对我来说无关紧要。
xi是一个100000x1的向量,不按顺序排列
例如,如果
x = [0 0.5 0.51 0.49999 1]
xi= [0.25 0.47 .9 0.4]
那么我们应该得到回报(使用从1开始的matlab索引):
pos = [1 1 4 1]
方法#1:完全向量化
如果您被允许使用bsxfun
,这可能是一种方法-
xt = x.'; %//' save transpose of x to be used at two places later on
[~,pos] = max(bsxfun(@le,xt(1:end-1),xi) & bsxfun(@gt,xt(2:end),xi),[],1)
方法2:部分向量化
您可以摆脱最内层的循环,获得这样的部分矢量化解决方案-
pos = zeros(length(xi),1);
for j = 1:length(xi)
pos(j) = find((x(1:end-1) <= xi(j)) & (xi(j) < x(2:end)),1);
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句