我正在尋找一種方法來避免代碼中的 for 回圈以縮短計算時間。
k = rand(15,15)
v= rand(6,15)
for i=1:6
C(i) = v(i, :) * k * v(i, :)'
end
這個例子有沒有這種可能性,可惜我什么都想不出來。在實際程式中,v 不會只有 6 行,而是數千行。
uj5u.com熱心網友回復:
以下將為您提供相同的結果。對于中型陣列(大約 1.5k),這比for
回圈快 15 倍。
k = rand(15,15)
v = rand(6,15)
C = diag(v(1:6,:) * k * v(1:6,:)')'
@Adriaan 建議的一個小基準顯示速度提高了g()
17 倍:
k = rand(1500,1500);
v = rand(1000,1500);
f = @() fun(k,v);
g = @() diag(v(1:600,:) * k * v(1:600,:)')';
timeit(f) % Time: 0.5122
timeit(g) % Time: 0.0332
function C = fun(k,v)
C = zeros(1,600);
for i = 1:600
C(i) = v(i, :) * k * v(i, :)';
end
end
這里應該明確一點,for
回圈不是罪魁禍首,而是向量矩陣與矩陣矩陣運算的底層 BLAS 實作;后者在 MKL 中被高度優化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/505803.html