我需要你的帮助来加快我的 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