作者fxxkjoe1231 (魯到入味)
看板MATLAB
標題[運算] 陣列加減運算加速
時間Tue Feb 18 17:38:25 2020
各位好,若在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,還沒運算就吃了一半記憶體,在跑運算時就整個吃光卡死。
謝謝大家。
-----
Sent from JPTT on my Sony G8441.
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.9.196.56 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/MATLAB/M.1582018707.A.273.html
1F:推 sunev: 全矩陣算法的中間計算過程應該避不掉MxLxN大小的矩陣 02/18 18:18
2F:→ sunev: 但善用bsxfun情況可能會好一些 02/18 18:19
3F:→ sunev: 新版本可省去bsxfun就是了 02/18 18:20
4F:→ sunev: x = pemute(INPUT_DATA,[1 3 2])-... 02/18 18:21
5F:→ sunev: DISTANCE = sum(x.^2,3); 02/18 18:22
6F:→ sunev: permute(INITIAL_CENTER,[3 1 2]); <--和上一行交換 02/18 18:23
7F:推 sunev: 查到了比較快的公式 02/18 18:36
8F:→ sunev: DISTANCE=sum(INPUT_DATA.^2,2)-sum(INITIAL_CENTER.^2,2)' 02/18 18:38
9F:→ sunev: -2*(INPUT_DATA*INITIAL_CENTER'); 02/18 18:38
10F:→ fxxkjoe1231: 後來的寫法是(a-b)^2=a^2-2ab+b^2的概念嗎 02/18 19:23
11F:推 sunev: yes 02/18 21:20
12F:→ fxxkjoe1231: 感謝,加速非常有感 02/19 18:57