[討論] 在一個矩陣中找出最多出現次數的向量

作者: 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