[运算] 分组平均

楼主: 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