作者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/cn.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