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

看板MATLAB作者 (魯到入味)時間4年前 (2020/02/18 17:38), 編輯推噓3(309)
留言12則, 2人參與, 4年前最新討論串1/1
各位好,若在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://www.ptt.cc/bbs/MATLAB/M.1582018707.A.273.html

02/18 18:18, 4年前 , 1F
全矩陣算法的中間計算過程應該避不掉MxLxN大小的矩陣
02/18 18:18, 1F

02/18 18:19, 4年前 , 2F
但善用bsxfun情況可能會好一些
02/18 18:19, 2F

02/18 18:20, 4年前 , 3F
新版本可省去bsxfun就是了
02/18 18:20, 3F

02/18 18:21, 4年前 , 4F
x = pemute(INPUT_DATA,[1 3 2])-...
02/18 18:21, 4F

02/18 18:22, 4年前 , 5F
DISTANCE = sum(x.^2,3);
02/18 18:22, 5F

02/18 18:23, 4年前 , 6F
permute(INITIAL_CENTER,[3 1 2]); <--和上一行交換
02/18 18:23, 6F

02/18 18:36, 4年前 , 7F
查到了比較快的公式
02/18 18:36, 7F

02/18 18:38, 4年前 , 8F
DISTANCE=sum(INPUT_DATA.^2,2)-sum(INITIAL_CENTER.^2,2)'
02/18 18:38, 8F

02/18 18:38, 4年前 , 9F
-2*(INPUT_DATA*INITIAL_CENTER');
02/18 18:38, 9F

02/18 19:23, 4年前 , 10F
後來的寫法是(a-b)^2=a^2-2ab+b^2的概念嗎
02/18 19:23, 10F

02/18 21:20, 4年前 , 11F
yes
02/18 21:20, 11F

02/19 18:57, 4年前 , 12F
感謝,加速非常有感
02/19 18:57, 12F
文章代碼(AID): #1UIx2J9p (MATLAB)
文章代碼(AID): #1UIx2J9p (MATLAB)