如何消除matlab中比较操作的循环?

How to eliminate loops for comparison operations in matlab?

我正在尝试消除 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

此循环将 return 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]

那么我们应该进入 return(使用从 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