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

Veridian

我试图消除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]

迪卡卡(Divakar)

方法#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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章