[運算] 分組平均

看板MATLAB作者 (魯到入味)時間4年前 (2020/02/20 00:56), 編輯推噓2(208)
留言10則, 2人參與, 4年前最新討論串1/1
大家好,若在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://www.ptt.cc/bbs/MATLAB/M.1582131411.A.5CE.html

02/20 08:44, 4年前 , 1F
有點像是accumarray,不過accumarray裡的val只能是一維
02/20 08:44, 1F

02/20 08:45, 4年前 , 2F
而你這裡的INPUT_DATA是N維。如果N不大,可以用迴圈處理
02/20 08:45, 2F

02/20 08:45, 4年前 , 3F
那個維度的話,就用accumarray試試。
02/20 08:45, 3F

02/20 08:46, 4年前 , 4F
for ii=1:L,center(:,i)=accumarray(INITIAL_CLUSTER,
02/20 08:46, 4F

02/20 08:46, 4年前 , 5F
INPUT_DATA(:,i),[],@mean);end
02/20 08:46, 5F

02/20 11:04, 4年前 , 6F
感謝s大,實測後仍較原始寫法慢,用accumarray雖然迴
02/20 11:04, 6F

02/20 11:04, 4年前 , 7F
圈變少,但每次迴圈執行時間卻有顯著增加
02/20 11:04, 7F

02/20 12:33, 4年前 , 8F
可以參考這個連結,把那層迴圈也省了
02/20 12:33, 8F

02/20 12:34, 4年前 , 9F

02/20 12:34, 4年前 , 10F
但我不知道會不會比較快就是了
02/20 12:34, 10F
文章代碼(AID): #1UJMZJNE (MATLAB)