簡體   English   中英

MATLAB-幫助加快代碼

[英]MATLAB - Help speed up the code

我需要您的幫助來加速我的MATLAB代碼。 17號線是最昂貴的部分。 這是因為有兩個嵌套循環。 我需要刪除循環並將其重寫為一個矩陣乘法表達式的幫助。 請注意,我已經將dKdx作為一個單元,這導致使用簡單的矩陣乘法項替換嵌套循環時會出現問題。 有任何想法嗎? 下面是一個簡化的代碼。 也許dKdx不必是一個單元格嗎? 單元格背后的想法是能夠存儲許多大小為[2 *(nelx + 1) nely + 1),2 (nelx + 1)*(nely + 1)]的矩陣。

    clc
    nelx = 16; nely = 8;
    dKdx = cell(2*(nelx+1)*(nely+1),1);
    Hess = zeros(nelx*nely,nelx*nely);
    U = rand(2*(nelx+1)*(nely+1),1);
    dUdx = rand(2*(nelx+1)*(nely+1),nelx*nely);

    for elx = 1:nelx
        for ely = 1:nely
            elm = nely*(elx-1)+ely;               
            dKdx{elm,1} = rand(2*(nelx+1)*(nely+1),2*(nelx+1)*(nely+1));
        end
    end

    for i = 1:nelx*nely    
        for j = i:nelx*nely
            Hess(i,j) = U'*dKdx{j,1}*dUdx(:,i);
            if i ~= j
                Hess(j,i) = Hess(i,j);
            end
        end
    end

這是獲得它的一種方法:

  B = reshape(U'*cell2mat(dKdx'),[size(U,1) nelx*nely]);
  C = B'*dUdx;
  Hess=tril(C)+triu(C',1);

在我的機器中,此代碼的運行速度比for循環1高6-7倍。 我想知道是否還有其他更快的方法...

粗麻布是瓶頸,這並不奇怪。 您必須計算O(n ^ 2)個矩陣元素,並且每個矩陣元素要進行O(n ^ 3)個工作,所以這是O(n ^ 5),這比求矩陣倒數還差(除非我誤解了碼)。

話雖如此,看來您應該可以用單個矩陣/矩陣乘法dKdx{j,1}*dUdx內部循環中的dKdx{j,1}*dUdx(:,i)矩陣/矢量乘法在外部循環中,然后只需在內部循環中拉出所需的特定列即可(您也需要首先使用j )。 我現在沒有時間自己嘗試該操作,但也許會對您有所幫助。

另一個想法:您確定矩陣中沒有可以利用的結構來減少矩陣乘法的數量嗎?

更新資料

在嘗試使我的想法可行的過程中,我提出了以下建議:

Hess2 = zeros(nelx*nely,nelx*nely);
for j=1:nelx*nely
    Hess2(j,:) = U'*dKdx{j,1}*dUdx;
end
Hess2 = tril(Hess2)+triu(Hess2',1);

在我的機器上,速度快25倍,但內特的速度快80倍,所以他擊敗了我!

暫無
暫無

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

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