【问题标题】:How to eliminate loops for comparison operations in matlab?如何消除matlab中比较操作的循环?
【发布时间】:2015-04-13 20:51:05
【问题描述】:

我正在尝试消除 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 的索引或边缘,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]

【问题讨论】:

  • 所以您不想同时使用逻辑索引或find
  • @m.s.,基本上,我计划在硬件中实现循环。我只想要一些实现与循环执行相同的操作,但速度更快。 find() 可能会起作用。我不能使用 histc() 因为边必须是单调递增的,而我的数据集没有这个特征。

标签: arrays algorithm matlab vector vectorization


【解决方案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

【讨论】:

  • 我最终使用 bsxfun 的第一种方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
相关资源
最近更新 更多