[運算] 陣列加減運算加速

作者: fxxkjoe1231 (糟糕)   2020-02-18 17:38:25
各位好,若在N維空間中有M個點,要分別計算這M個點與特定L個點的相對距離,該如何在不用迴圈且最節省記憶體的前提下計算?
目前迴圈寫法如下:
for ii=1:L
DISTANCE(:,ii)=sum((INPUT_DATA-INITIAL_CENTER(ii,:)).^2,2);
end
其中DISTANCE為MxL;INPUT_DATA為MxN;INITIAL_CENTER為LxN;
後來有用repmat改寫,INPUT_DATA改MxNxL;INITIAL_CENTER為1xNxL,還沒運算就吃了一半記憶體,在跑運算時就整個吃光卡死。
謝謝大家。
作者: sunev (Veritas)   2020-02-18 18:18:00
全矩陣算法的中間計算過程應該避不掉MxLxN大小的矩陣但善用bsxfun情況可能會好一些新版本可省去bsxfun就是了x = pemute(INPUT_DATA,[1 3 2])-...DISTANCE = sum(x.^2,3);permute(INITIAL_CENTER,[3 1 2]); <--和上一行交換查到了比較快的公式DISTANCE=sum(INPUT_DATA.^2,2)-sum(INITIAL_CENTER.^2,2)'-2*(INPUT_DATA*INITIAL_CENTER');
作者: fxxkjoe1231 (糟糕)   2020-02-18 19:23:00
後來的寫法是(a-b)^2=a^2-2ab+b^2的概念嗎
作者: sunev (Veritas)   2020-02-18 21:20:00
yes
作者: fxxkjoe1231 (糟糕)   2020-02-19 18:57:00
感謝,加速非常有感

Links booklink

Contact Us: admin [ a t ] ucptt.com