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

看板MATLAB作者 (草草)時間7年前 (2016/07/15 00:22), 7年前編輯推噓7(7031)
留言38則, 4人參與, 最新討論串1/3 (看更多)
小弟的程式如下 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) 請問大大這樣的程式要如何寫呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.102.186.20 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1468513354.A.22C.html ※ 編輯: popo14777 (59.102.186.20), 07/15/2016 00:26:59

07/15 00:50, , 1F
[N,Xedges,Yedges]= histcounts2(A, B, 0:24, 0:24)
07/15 00:50, 1F

07/15 00:50, , 2F
N就是所求
07/15 00:50, 2F

07/15 00:51, , 3F
N=histcounts2(A, B, 1:17, 1:24);
07/15 00:51, 3F

07/15 00:51, , 4F
更正,17跟24可以用A跟B的最大值代替
07/15 00:51, 4F

07/15 00:53, , 5F
對不起 我想錯了
07/15 00:53, 5F

07/15 09:12, , 6F
C大這個方法還是不行耶
07/15 09:12, 6F

07/15 09:15, , 7F
喔喔,看到你新發的一封了
07/15 09:15, 7F

07/15 10:43, , 8F
我會建議設 D = C + random_noise; 然後對D的col vec做
07/15 10:43, 8F

07/15 10:45, , 9F
clustering. 看分群的結果,cluster數就是不同的相量數,
07/15 10:45, 9F

07/15 10:46, , 10F
每個cluster內的資料點數,就是出現次數.
07/15 10:46, 10F

07/15 10:46, , 11F
不過當資料不夠大不夠多的時候,不要用這個方法,因為
07/15 10:46, 11F

07/15 10:46, , 12F
不見得能省計算複雜度.
07/15 10:46, 12F

07/15 13:33, , 13F
謝謝Y大,但我最重要的問題要如何得到11這個數值喔
07/15 13:33, 13F

07/17 09:49, , 14F
已解決,謝謝各位C大與Y大的幫忙
07/17 09:49, 14F

07/18 13:35, , 15F
CC=C(:,all(C,1));
07/18 13:35, 15F

07/18 13:42, , 16F
[N,Xedges,Yedges]=histcounts2(CC(1,:),CC(2,:),...
07/18 13:42, 16F

07/18 13:42, , 17F
'BinMethod','integers');
07/18 13:42, 17F

07/18 13:42, , 18F
[~,I]=max(N(:));[i,j]=ind2sub(size(N),I);
07/18 13:42, 18F

07/18 13:43, , 19F
find(C(1,:)==ceil(Xedges(i))&C(2,:)==ceil(Yedges(j))...
07/18 13:43, 19F

07/18 13:43, , 20F
,'BinMethod','integers')
07/18 13:43, 20F

07/18 19:16, , 21F
s大你那樣不能用超過2個column的,我有想過XD
07/18 19:16, 21F

07/18 19:38, , 22F
啊呀,本來想練習histcounts2的,那還是只能用unique rows
07/18 19:38, 22F

07/18 19:39, , 23F
[CC,Ia,Ic]=unique(C(:,all(C,1))','rows');
07/18 19:39, 23F

07/18 19:39, , 24F
N=histc(Ic,1:size(CC,1));[~,I]=max(N);
07/18 19:39, 24F

07/18 19:40, , 25F
find(all(bsxfun(@eq,CC(I,:)',C),1),1,'first')
07/18 19:40, 25F

07/18 19:54, , 26F
這個版本可能快一點,少一個find及二維@eq,多一個max
07/18 19:54, 26F

07/18 19:54, , 27F
[CC,Ia,Ic]=unique(C(:,all(C,1))','rows');
07/18 19:54, 27F

07/18 19:54, , 28F
N=histc(Ic,1:size(CC,1));[~,I]=max(N);
07/18 19:54, 28F

07/18 19:55, , 29F
if ~all(CC(I)),N(I)=[];Ia(I)=[];[~,I]=max(N);end
07/18 19:55, 29F

07/18 19:55, , 30F
Ia(I)
07/18 19:55, 30F

07/19 11:36, , 31F
這個問題,我考慮的點一直是: 如果是高維向量該怎麼辦?
07/19 11:36, 31F

07/19 11:37, , 32F
所以才會在一開始想直接在高維空間上做clustering,
07/19 11:37, 32F

07/19 11:38, , 33F
後來改成採取hashing的概念,把向量換算成某個scalar,
07/19 11:38, 33F

07/19 11:39, , 34F
接下來就只需要從一串scalar裡面找眾數而已.
07/19 11:39, 34F

07/19 11:40, , 35F
我比較有興趣知道,如果當輸入的k-by-N矩陣非常大的時候
07/19 11:40, 35F

07/19 11:41, , 36F
該用什麼觀點看這個問題會比較有效率...
07/19 11:41, 36F

07/19 11:42, , 37F
例如: 如果 k=256, N=100,000 這種規模.
07/19 11:42, 37F

07/19 13:13, , 38F
就偷懶用內建unique rows來處理vector -> scalar的問題
07/19 13:13, 38F
文章代碼(AID): #1NXxnA8i (MATLAB)
文章代碼(AID): #1NXxnA8i (MATLAB)