1

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

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

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

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

换言之, 的第 n 列对应于基于和A的第 n 列的插值。XiXY(:,n)

我目前正在使用循环来创建矩阵A。另一种选择是使用以下命令:

interp1(X,Y,Xi)

此命令的问题在于 MATLAB 将创建一个N x k x k矩阵,因为它会XiY. 因此,避免循环所带来的任何速度优势都会被执行的额外插值所抵消,尤其k是在很大的情况下。

我还缺少第三种选择吗?

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

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

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

1 回答 1

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 循环的情况下,这些检查每列k发生一次;向量化它们发生N xk次:

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

优化此代码的最佳方法是,如果您已经了解输入数据的一些特殊情况。

  • 如果X是均匀间隔的,您可以计算边界并线性重新缩放Xi以计算您的索引。即使用, ,等编写您自己的myInterp1()函数。linspace()floor()ceil()
  • 如果X是非均匀间隔的,但没有重复值排序,您可以使用它interp1q()来消除对输入数据的一些检查X。请注意,这已被 Mathworks正式弃用,但自 r2012b 起仍可用。
于 2013-06-28T23:08:49.617 回答