作者popo14777 (草草)
看板MATLAB
标题[讨论] 在一个矩阵中找出最多出现次数的向量
时间Fri Jul 15 00:22:31 2016
小弟的程式如下
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://webptt.com/cn.aspx?n=bbs/MATLAB/M.1468513354.A.22C.html
※ 编辑: popo14777 (59.102.186.20), 07/15/2016 00:26:59
1F:→ celestialgod: [N,Xedges,Yedges]= histcounts2(A, B, 0:24, 0:24) 07/15 00:50
2F:→ celestialgod: N就是所求 07/15 00:50
3F:→ celestialgod: N=histcounts2(A, B, 1:17, 1:24); 07/15 00:51
4F:→ celestialgod: 更正,17跟24可以用A跟B的最大值代替 07/15 00:51
5F:→ celestialgod: 对不起 我想错了 07/15 00:53
6F:→ popo14777: C大这个方法还是不行耶 07/15 09:12
7F:→ popo14777: 喔喔,看到你新发的一封了 07/15 09:15
8F:推 YoursEver: 我会建议设 D = C + random_noise; 然後对D的col vec做 07/15 10:43
9F:→ YoursEver: clustering. 看分群的结果,cluster数就是不同的相量数, 07/15 10:45
10F:→ YoursEver: 每个cluster内的资料点数,就是出现次数. 07/15 10:46
11F:→ YoursEver: 不过当资料不够大不够多的时候,不要用这个方法,因为 07/15 10:46
12F:→ YoursEver: 不见得能省计算复杂度. 07/15 10:46
13F:→ popo14777: 谢谢Y大,但我最重要的问题要如何得到11这个数值喔 07/15 13:33
14F:→ popo14777: 已解决,谢谢各位C大与Y大的帮忙 07/17 09:49
15F:推 sunev: CC=C(:,all(C,1)); 07/18 13:35
16F:推 sunev: [N,Xedges,Yedges]=histcounts2(CC(1,:),CC(2,:),... 07/18 13:42
17F:→ sunev: 'BinMethod','integers'); 07/18 13:42
18F:→ sunev: [~,I]=max(N(:));[i,j]=ind2sub(size(N),I); 07/18 13:42
19F:→ sunev: find(C(1,:)==ceil(Xedges(i))&C(2,:)==ceil(Yedges(j))... 07/18 13:43
20F:→ sunev: ,'BinMethod','integers') 07/18 13:43
21F:→ celestialgod: s大你那样不能用超过2个column的,我有想过XD 07/18 19:16
22F:推 sunev: 啊呀,本来想练习histcounts2的,那还是只能用unique rows 07/18 19:38
23F:→ sunev: [CC,Ia,Ic]=unique(C(:,all(C,1))','rows'); 07/18 19:39
24F:→ sunev: N=histc(Ic,1:size(CC,1));[~,I]=max(N); 07/18 19:39
25F:→ sunev: find(all(bsxfun(@eq,CC(I,:)',C),1),1,'first') 07/18 19:40
26F:推 sunev: 这个版本可能快一点,少一个find及二维@eq,多一个max 07/18 19:54
27F:→ sunev: [CC,Ia,Ic]=unique(C(:,all(C,1))','rows'); 07/18 19:54
28F:→ sunev: N=histc(Ic,1:size(CC,1));[~,I]=max(N); 07/18 19:54
29F:→ sunev: if ~all(CC(I)),N(I)=[];Ia(I)=[];[~,I]=max(N);end 07/18 19:55
30F:→ sunev: Ia(I) 07/18 19:55
31F:推 YoursEver: 这个问题,我考虑的点一直是: 如果是高维向量该怎麽办? 07/19 11:36
32F:→ YoursEver: 所以才会在一开始想直接在高维空间上做clustering, 07/19 11:37
33F:→ YoursEver: 後来改成采取hashing的概念,把向量换算成某个scalar, 07/19 11:38
34F:→ YoursEver: 接下来就只需要从一串scalar里面找众数而已. 07/19 11:39
35F:→ YoursEver: 我比较有兴趣知道,如果当输入的k-by-N矩阵非常大的时候 07/19 11:40
36F:→ YoursEver: 该用什麽观点看这个问题会比较有效率... 07/19 11:41
37F:→ YoursEver: 例如: 如果 k=256, N=100,000 这种规模. 07/19 11:42
38F:推 sunev: 就偷懒用内建unique rows来处理vector -> scalar的问题 07/19 13:13