我有以下 MATLAB 代碼來計算應變能。我想優化這段代碼,因為這是我在優化問題上的大部分時間。
stiffness = [6 x 6 matrix] % For a MWE, try magic(6) magic(6)';
exx(:)=[100 x 100 matrix]; eyy(:)=[100 x 100 matrix]; %etc.
for idr = 1:length(r) % Index of r-location
for idt = 1:length(theta) % Index of theta location
e = [exx(idr,idt);eyy(idr,idt);ezz(idr,idt);2*exz(idr,idt);2*eyz(idr,idt);2*exy(idr,idt)]; % strain vector
E(idr,idt) = e'*stiffness*e; %$ Strain energy at this location
end
end
這里有兩個問題:
- 因為
length(r)==length(theta)==100,這段代碼被呼叫了 10k 次。 - 在回圈中花費的時間大約有三分之一用于組裝
e而不實際進行任何計算。
我認為應該有一些方法可以通過正確使用矢量化來顯著加快速度,但我不完全確定在這種特殊情況下如何進行。
注意:有一些類似的問題,例如this,所以也許有一些想法可以轉化為 MATLAB。
uj5u.com熱心網友回復:
另一種選擇,比@bla 的答案快約 x2 倍,
eall=([exx(:),eyy(:),ezz(:),2*exz(:),2*eyz(:),2*exy(:)]);
E = reshape(sum(stiffness*eall.*eall),[100 100])
利用e向量這一事實,我們可以進行元素乘法的總和,而不是向量乘積。
uj5u.com熱心網友回復:
這是矢量化代碼的一種方法,vector'*matrix*vector通過將資訊擴展到第 3 維來一次對所有元素執行操作:
eall=([exx(:),eyy(:),ezz(:),2*exz(:),2*eyz(:),2*exy(:)]);
E=(reshape(pagemtimes(permute(eall,[3 2 1]),pagemtimes(stiffness,permute(eall,[2 3 1]))),[100 100]));
我不確定性能的提高會有多顯著,我在你擁有的 100x100 示例中得到了 ~x5 ......
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314085.html
