我目前有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列对应于基于Xi
和X
的{{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))
答案 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
均匀分布,您可以计算边界并线性重新缩放Xi
以计算您的指标。即使用myInterp1()
,linspace()
,floor()
等编写您自己的ceil()
函数。X
非均匀间隔,但排序时没有重复值,则可以使用interp1q()
来消除对输入数据X
的某些检查。请注意,Mathworks已经正式弃用,但从r2012b开始仍然可用。