[讨论] 在一个矩阵中找出最多出现次数的向量

楼主: popo14777 (草草)   2016-07-15 00:22:31
小弟的程式如下
A=[0 0 0 0 0 17 17 19 19 19 17 17 17 17 17]
B=[0 0 0 0 0 22 22 24 24 24 24 24 24 24 24]
C=[A;B]
0,0 出现5次
17,22 出现2次
19,24 出现3次
17,24 出现4次
直向量的个数有15个
在C的一个矩阵下挑出次数最多的直向量,且要最少个数,还要不包含零
所以挑第11组(17,24)的直向量,并取得11这个数值
小弟还有其他矩阵,例如矩阵为11*15(这个范例是2*15)
请问大大这样的程式要如何写呢?
谢谢
作者: celestialgod (天)   2016-07-15 00:50:00
[N,Xedges,Yedges]= histcounts2(A, B, 0:24, 0:24)N就是所求N=histcounts2(A, B, 1:17, 1:24);更正,17跟24可以用A跟B的最大值代替对不起 我想错了
楼主: popo14777 (草草)   2016-07-15 09:12:00
C大这个方法还是不行耶喔喔,看到你新发的一封了
作者: YoursEver (猪是妳)   2016-07-15 10:43:00
我会建议设 D = C + random_noise; 然后对D的col vec做clustering. 看分群的结果,cluster数就是不同的相量数,每个cluster内的资料点数,就是出现次数.不过当资料不够大不够多的时候,不要用这个方法,因为不见得能省计算复杂度.
楼主: popo14777 (草草)   2016-07-15 13:33:00
谢谢Y大,但我最重要的问题要如何得到11这个数值喔
作者: sunev (Veritas)   2016-07-18 13:35:00
CC=C(:,all(C,1));[N,Xedges,Yedges]=histcounts2(CC(1,:),CC(2,:),...'BinMethod','integers');[~,I]=max(N(:));[i,j]=ind2sub(size(N),I);find(C(1,:)==ceil(Xedges(i))&C(2,:)==ceil(Yedges(j))...,'BinMethod','integers')
作者: celestialgod (天)   2016-07-18 19:16:00
s大你那样不能用超过2个column的,我有想过XD
作者: sunev (Veritas)   2016-07-18 19:38:00
啊呀,本来想练习histcounts2的,那还是只能用unique rows[CC,Ia,Ic]=unique(C(:,all(C,1))','rows');N=histc(Ic,1:size(CC,1));[~,I]=max(N);find(all(bsxfun(@eq,CC(I,:)',C),1),1,'first')这个版本可能快一点,少一个find及二维@eq,多一个max[CC,Ia,Ic]=unique(C(:,all(C,1))','rows');N=histc(Ic,1:size(CC,1));[~,I]=max(N);if ~all(CC(I)),N(I)=[];Ia(I)=[];[~,I]=max(N);endIa(I)
作者: YoursEver (猪是妳)   2016-07-19 11:36:00
这个问题,我考虑的点一直是: 如果是高维向量该怎么办?所以才会在一开始想直接在高维空间上做clustering,后来改成采取hashing的概念,把向量换算成某个scalar,接下来就只需要从一串scalar里面找众数而已.我比较有兴趣知道,如果当输入的k-by-N矩阵非常大的时候该用什么观点看这个问题会比较有效率...例如: 如果 k=256, N=100,000 这种规模.
作者: sunev (Veritas)   2016-07-19 13:13:00
就偷懒用内建unique rows来处理vector -> scalar的问题

Links booklink

Contact Us: admin [ a t ] ucptt.com