[運算] 分組平均

作者: fxxkjoe1231 (糟糕)   2020-02-20 00:56:49
大家好,若在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,
但在運算效率上還是前述迴圈有明顯的優勢,
是否有不用迴圈又快速的方法可以達到同樣效果?謝謝大家!
作者: sunev (Veritas)   2020-02-20 08:44:00
有點像是accumarray,不過accumarray裡的val只能是一維而你這裡的INPUT_DATA是N維。如果N不大,可以用迴圈處理那個維度的話,就用accumarray試試。for ii=1:L,center(:,i)=accumarray(INITIAL_CLUSTER,INPUT_DATA(:,i),[],@mean);end
作者: fxxkjoe1231 (糟糕)   2020-02-20 11:04:00
感謝s大,實測後仍較原始寫法慢,用accumarray雖然迴圈變少,但每次迴圈執行時間卻有顯著增加
作者: sunev (Veritas)   2020-02-20 12:33:00
可以參考這個連結,把那層迴圈也省了https://stackoverflow.com/questions/4350735/但我不知道會不會比較快就是了

Links booklink

Contact Us: admin [ a t ] ucptt.com