如果你有,就像你說的,所有測量不同的測量時間(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和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;
請提供一些數據以改進您的解決方案。該配置文件將使我們能夠了解瓶頸在哪裏。 –
@Andrey - 對不起。這個問題的重點不是「我如何加快我的代碼?」關鍵是 - 「這可以通過使用矩陣運算/函數來完成」來消除for循環。我將編輯該問題以刪除對執行時間的引用,這是一種紅鯡魚。 – Marc
你看,循環不是邪惡的。你說表演不是你的主要興趣。你想要矢量化的原因是什麼?你想爲讀者提供更清晰的代碼嗎?也許爲了節省內存空間? –