あなたが言うように、すべての測定の測定時間が異なる場合 (T は行列であり、ベクトルではありません)、次のように arrayfun を 1 回呼び出すだけで、必要なことを行うことができます。
VI = arrayfun(@(x)(interp1(T(x,:),V(x,:),TI)), 1:size(V, 1), 'UniformOutput', false);
VI = cell2mat(VI');
arrayfun はループに似ていますが、内部の matlab 関数であるため、より高速な場合があります。これはベクトルのセルを返すため、2 行目で出力として行列があることを確認します。あなたはそれを必要としないかもしれません-それは後でデータをどうするかによって異なります.
一方、N の異なる値に対して測定値が同時に取得された場合 (T はサイズ S のベクトルであり、行列ではありません。つまり、T のすべての行が等しい場合)、1 回の呼び出しで補間できます。 interp1 へ。
VI = interp1(T(1,:), V', TI)
ここでは、interp1 が列内で補間されるため、V を転置する必要があります。これは、MATLAB が行列を列単位で格納するためです (列はメモリ内で連続しています)。V を SxN 行列として渡すと、すべての CPU がより効率的な方法でメモリにアクセスできるため、interp1 のより効率的な並列化が可能になる可能性があります。したがって、もちろん、パフォーマンス上の理由でこの正確なデータ レイアウトを別の場所に依存しない限り、コード全体で行列を転置することをお勧めします。
編集行列の列レイアウトのため、行列を転置して列ごとに作業することで元のコードを改善できます。次のバージョンは、N=1000、S=10000、TI が 10000 要素の場合、私のコンピューターで約 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;