【发布时间】: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