作者fxxkjoe1231 (魯到入味)
看板MATLAB
標題[運算] 分組平均
時間Thu Feb 20 00:56:49 2020
大家好,若在N維空間中有M個點,分別屬於不同類別,該如何快速計算各類別的中心座標?
目前寫法如下
for ii=1:L
temp = double(INITIAL_CLUSTER==ii);
center(ii,:) = sum(temp.*INPUT_DATA) / sum(temp);
end
其中INPUT_DATA為MxN;INITIAL_CLUSTER為Mx1,內為M個點對應的存放組別1~L。
中間試了很多方法想要取代或是減少迴圈數,有grpstats、splitapply及consolidator,
但在運算效率上還是前述迴圈有明顯的優勢,
是否有不用迴圈又快速的方法可以達到同樣效果?謝謝大家!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.224.60.13 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/MATLAB/M.1582131411.A.5CE.html
1F:推 sunev: 有點像是accumarray,不過accumarray裡的val只能是一維 02/20 08:44
2F:→ sunev: 而你這裡的INPUT_DATA是N維。如果N不大,可以用迴圈處理 02/20 08:45
3F:→ sunev: 那個維度的話,就用accumarray試試。 02/20 08:45
4F:→ sunev: for ii=1:L,center(:,i)=accumarray(INITIAL_CLUSTER, 02/20 08:46
5F:→ sunev: INPUT_DATA(:,i),[],@mean);end 02/20 08:46
6F:→ fxxkjoe1231: 感謝s大,實測後仍較原始寫法慢,用accumarray雖然迴 02/20 11:04
7F:→ fxxkjoe1231: 圈變少,但每次迴圈執行時間卻有顯著增加 02/20 11:04
8F:推 sunev: 可以參考這個連結,把那層迴圈也省了 02/20 12:33
10F:→ sunev: 但我不知道會不會比較快就是了 02/20 12:34