如您所说,如果您对所有测量有不同的测量时间(T 是矩阵而不是向量),则可以通过一次调用 arrayfun 来执行您想要的操作,如下所示:
VI = arrayfun(@(x)(interp1(T(x,:),V(x,:),TI)), 1:size(V, 1), 'UniformOutput', false);
VI = cell2mat(VI');
arrayfun 类似于循环,但由于它是一个内部 matlab 函数,它可能会更快。它返回一个向量单元,因此第二行确保您有一个矩阵作为输出。您可能不需要它 - 这取决于您以后如何处理数据。
另一方面,如果在同一时间对不同的 N 值进行了测量(T 是大小为 S 的向量,而不是矩阵,或者换句话说,T 的所有行都相等),您可以在一次调用中进行插值到interp1。
VI = interp1(T(1,:), V', TI)
在这里你必须转置 V 因为 interp1 在列内插值。这是因为 MATLAB 按列存储矩阵(列在内存中是连续的)。如果将 V 作为 SxN 矩阵传递,它可能会允许更有效的 interp1 并行化,因为所有 CPU 都可以以更有效的方式访问内存。因此,我建议您在整个代码中转置矩阵,除非您出于性能原因在其他地方依赖此确切的数据布局。
编辑由于矩阵的列布局,您的原始代码可以通过转置矩阵和按列工作来改进。对于 N=1000、S=10000 和 10000 个元素的 TI,以下版本在我的计算机上快了大约 20%。由于内存带宽利用率更高,它可能会随着系统大小而增长。
tic;
VI = zeros(size(TI,2), size(V,2));
for j = 1:size(V,2)
VI(:,j) = interp1(T(:,j),V(:,j),TI);
end
toc;