执行许多插值的有效方法

时间:2013-06-28 16:02:42

标签: matlab loops interpolation

我目前有3个矩阵:X(N x 1),Y(N x k)和Xi(N x(j + k))。

为了简单描述我的问题,我假设j=0

基本上我想要的是一个N x k矩阵A,其中:

A(:,t) = interp1(X,Y(:,t),Xi(:,t))

换句话说,A的第n列对应于基于XiX的{​​{1}}第n列的插值。

我目前正在使用循环来创建矩阵Y(:,n)。另一种选择是使用命令:

A

此命令的问题在于MATLAB将创建interp1(X,Y,Xi) 矩阵,因为它会在N x k x k中为Xi中的每一列插入Y中的所有列。因此,避免循环的任何速度益处都被执行的额外插值抵消,特别是如果k很大。

我缺少第三种选择吗?

编辑:我一直在尝试使用bsxfun,但我似乎无法让它正常工作。我也不知道如何使用j > 0(见下文)来解决这个问题。

PS :如果j > 0,那么现在需要的矩阵

A(:, 1+tj:(t+1)j) = interp1(X, Y(:,t), Xi(:,tj:(t+1)j))

1 个答案:

答案 0 :(得分:0)

要重述这个问题,我们正在尝试优化/矢量化此代码段:

X = rand(N,1);
Y = rand(N,k);  % Large k
Xi = rand(N,k*j);   
A = zeros(size(Xi));
for i = 1:k
  A(:,k) = interp1(X,Y(:,k),Xi(:,k));
end

首先要注意的是,矢量化不会改善事物。例如,我们可以使用以下代码消除for循环:

tic
myColumn = mod(repmat(1:(k*j),N,1),k);   % The Y column for any given Xi column
A = arrayfun(@(a,b)interp1(X,Y(:,b),a), Xi, myColumn);
toc

在我的计算机上,矢量化版本运行的因子 N 更慢。为什么? interp1()对输入数据X进行了多次检查。在for-loop情况下,每列 k 进行一次检查;矢量化它们发生 N x k 次:

  • X是否排序?
  • X是否包含重复值?
  • X是否均匀分布?

优化此代码的最佳方法是,如果您已经了解了有关输入数据的特殊信息。

  • 如果X均匀分布,您可以计算边界并线性重新缩放Xi以计算您的指标。即使用myInterp1()linspace()floor()等编写您自己的ceil()函数。
  • 如果X非均匀间隔,但排序时没有重复值,则可以使用interp1q()来消除对输入数据X的某些检查。请注意,Mathworks已经正式弃用,但从r2012b开始仍然可用。