私の MATLAB コードを高速化するためにあなたの助けが必要です。ライン 17 は最も高価な部品です。これは、2 つのネストされたループが原因です。ループを削除して、それを 1 つの行列乗算式に書き直すのに助けが必要です。セルとして dKdx を使用しているため、ネストされたループを単純な行列乗算項に置き換えるという問題が発生していることに注意してください。何か案は?以下は簡略化したコードです。dKdx はセルである必要はないのでしょうか? cell の背後にあるアイデアは、[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