查看: 15366|回復: 14|關注: 0
打印 上一主題 下一主題

快乐扑克3豹子中奖: [已解決] MATLAB如何計算一個向量中每個相同元素的個數?

[復制鏈接]

新手

34 麥片

財富積分


快乐扑克3如何跟对子 www.vqxik.tw 050


47

主題

216

帖子

0

最佳答案
  • 關注者: 1
跳轉到指定樓層
1#
例如有一個向量
  x = [1 1 1 2 2 4 5 5 5 5]';
我想得到向量 y ,使得它為
y  = [3 2 1 4]';
其中 y 中的 3,2,1,4 分別表示 x 中有 3 個 1,2 個 2, 1 個 4 ,4 個5。請問該如何實現 or matlab中是否有函數實現此功能呢?

論壇優秀回答者

權威

4329 麥片

財富積分



3

主題

8873

帖子

987

最佳答案
QQ
  • 關注者: 291
2#
發表于 2015-10-5 20:53:49 | 只看該作者
你的x是順序排列的么??

論壇優秀回答者

權威

4329 麥片

財富積分



3

主題

8873

帖子

987

最佳答案
QQ
  • 關注者: 291
3#
發表于 2015-10-5 20:57:05 | 只看該作者
  1. a = [1 1 1 2 2 4 5 5 5 5];
  2. b = sort(a);
  3. for i=1:length(c)
  4. if i~=length(c)
  5. t(i) = d(i+1)-d(i);
  6. else
  7. t(i) = length(b)-d(i);
  8. end
  9. end
復制代碼

新手

44 麥片

財富積分


050


6

主題

80

帖子

8

最佳答案
  • 關注者: 2
4#
發表于 2015-10-5 22:06:00 | 只看該作者
diff(find([diff([inf,x])~=0 1]))

論壇優秀回答者

24

主題

1萬

帖子

1639

最佳答案
  • 關注者: 972
5#
發表于 2015-10-5 23:51:28 | 只看該作者 |此回復為最佳答案
Histogram bin counts 是專門做這個的,可供選擇的函數有很多,如果版本比較老,可以用 hist 或 histc,相對新的版本可以用 histcounts

>> histc(x,unique(x))

另外,還可以用 accumarray 實現,accumarray 文檔里的例子就是教你怎么做這個的

新手

34 麥片

財富積分


050


47

主題

216

帖子

0

最佳答案
  • 關注者: 1
6#
 樓主| 發表于 2015-10-6 09:19:33 | 只看該作者
winner245 發表于 2015-10-5 23:51
Histogram bin counts 是專門做這個的,可供選擇的函數有很多,如果版本比較老,可以用 hist 或 histc,相 ...

謝謝,你真厲害??!我的好多問題都是你回答的,你懂的真多!佩服

新手

34 麥片

財富積分


050


47

主題

216

帖子

0

最佳答案
  • 關注者: 1
7#
 樓主| 發表于 2015-10-6 09:20:03 | 只看該作者

試了下,你這出現錯誤了

新手

34 麥片

財富積分


050


47

主題

216

帖子

0

最佳答案
  • 關注者: 1
8#
 樓主| 發表于 2015-10-6 09:20:46 | 只看該作者

下面有答復你有直接用matlab函數解決了,謝謝你的參與!

新手

44 麥片

財富積分


050


6

主題

80

帖子

8

最佳答案
  • 關注者: 2
9#
發表于 2015-10-6 09:38:46 | 只看該作者
shufessm 發表于 2015-10-6 09:20
試了下,你這出現錯誤了

你應該沒有把x轉置回來吧
x = [1 1 1 2 2 4 5 5 5 5]
diff(find([diff([inf,x])~=0 1]))
這樣就不會出錯~
不過winner245版主的回答的確強大很多~

論壇優秀回答者

1

主題

9787

帖子

1470

最佳答案
  • 關注者: 341
10#
發表于 2015-10-6 11:07:59 | 只看該作者
本帖最后由 kaaaf123 于 2015-10-6 17:04 編輯
含淚飲砒霜 發表于 2015-10-6 09:38
你應該沒有把x轉置回來吧
x = [1 1 1 2 2 4 5 5 5 5]
diff(find([diff()~=0 1]))

其實這個問題如果論性能的話,還是你的方法更好一些,不過要稍微改一下以適用于a中元素沒有提前排序的情況:
c = diff(find([1;diff(sort(a(:)));1]));

對比:
a = round(1e6*rand(1e6,1))/100;
tic
b = histc(a,unique(a));
toc
tic % histcounts是r2014b引入的函數
edge = unique(a); edge(end+1) = inf;
c = histcounts(a,edge).';
toc
tic
d = diff(find([1;diff(sort(a(:)));1]));
toc
tic
[~,~,k] = unique(a);
e = accumarray(k,1);
toc
isequal(b,c,d,e)

而且,如果已知a提前排序,則diff的方法中的sort可以省略,可以進一步加速
另外,如果問題中的a全為整數,且可以作為或者比較簡單的變化為索引值,那么accumarray的方法就不需要unique操作,則accumarray的方法也可以更快
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

關閉

站長推薦上一條 /4 下一條

快速回復 快乐扑克3如何跟对子 返回列表