查看: 14026|回复: 14|关注: 0
打印 上一主题 下一主题

体彩快乐扑克最大遗漏: [已解决] 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中是否有函数实现此功能呢?

论坛优秀回答者

权威

4327 麦片

财富积分



3

主题

8873

帖子

987

最佳答案
QQ
  • 关注者: 288
2#
发表于 2015-10-5 20:53:49 | 只看该作者
你的x是顺序排列的么??

论坛优秀回答者

权威

4327 麦片

财富积分



3

主题

8873

帖子

987

最佳答案
QQ
  • 关注者: 288
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
复制代码

新手

40 麦片

财富积分


050


5

主题

76

帖子

7

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

论坛优秀回答者

24

主题

1万

帖子

1638

最佳答案
  • 关注者: 943
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函数解决了,谢谢你的参与!

新手

40 麦片

财富积分


050


5

主题

76

帖子

7

最佳答案
  • 关注者: 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

帖子

1467

最佳答案
  • 关注者: 334
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的方法也可以更快
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

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