簡體   English   中英

減少包含幾個矩陣運算的 Matlab 循環執行時間的提示

[英]Tips to reduce the execution time of this Matlab loop containing several matrix operations

我正在嘗試使用以下簡化的 Matlab 代碼評估矩陣Y(p,k)Z(p,k)

它們取決於我能夠預先計算的一些矩陣A(j,k)B(j,p)C(j,k) ,所以我剛剛將它們初始化為這個 MWE 的隨機 arrays 。 (請注意,B 與 A 和 C 的大小不同)。

Nj = 5000;
Nk = 1000;
Np = 500;  % max loop iterations

A = rand(Nj,Nk);  % dummy precalculated matrices
B = rand(Nj,Np);
C = rand(Nj,Nk);

Y = zeros(Np,Nk); % allocate storage
Z = zeros(Np,Nk);

tic
for p = 1:Np
   
    X = A .* B(:,p);
    Y(p,:) = sum( X , 1 ); 
    Z(p,:) = sum( C .* X , 1 );
    
end
toc    % Evaluates to 11 seconds on my system

如上所示,我通過循環索引p重復我的計算(因為矩陣B取決於p )。

通過將所有可以預先計算的內容移到循環之外(包含在 A、B 和 C 中),我已經設法做到了這一點,但是在我的系統上,這段代碼仍然需要大約 11 秒才能執行。 任何人都可以在 Matlab 中看到一種方法來加快速度,或者甚至可以一次刪除循環和處理?

謝謝

我認為以下應該是等效的並且更快:

Y = B' * A;
Z = B' * (A.*C);

筆記:

  • 如果B是復值,那么你應該使用.' 換位。
  • 您可能還希望直接以轉置形式預先計算 B(即作為 Np 乘 Nj 矩陣),以完全避免轉置。
  • 如果其他任何地方都不需要 C,則將其預先計算為A.*C以避免額外的元素乘法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM