声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4094|回复: 5

[编程技巧] 如何找出数组中的重复的数据?

[复制链接]
发表于 2008-10-28 06:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
比如A是一个n by 3的矩阵,其中A(:,1:2)是坐标,A(:,3)是坐标对应的值,在同一个坐标上,会有不同的值,也就是A(:,1:2)中有重复的点,我需要找出这些重复的位置,然后选取与之对应的A(:,3)的较大的数值。
A =
1     1      5
1     1      7
1     2      8
2     1      4
2     1      2

这里边(1,1)的点有两个值,只需要选取较大值7,

请问这个情况,怎么用matlab达到这个目的?

谢谢大家的帮助!
回复
分享到:

使用道具 举报

发表于 2008-10-28 15:15 | 显示全部楼层
楼主如果用的是7.1以后的matlab可以利用accumarray函数。

  1. B = accumarray(A(:,[1 2]),A(:,3),[],@max,nan);
  2. [row,col] = find(~isnan(B));
  3. UwantedResult = [row,col ,B(~isnan(B))]
复制代码
如果你的坐标值很大(比如好几千以上,避免生成的矩阵size太大,需要让B为稀疏形式,此时B = accumarray(A(:,[1 2]),A(:,3),[],@max,0,true);即可。当然相同坐标值的数最大的不能为0,否则,稀疏矩阵会丢掉它。但是上面那个没这个问题,因为非坐标点都置为nan了)。
如果坐标不是整数值,就得想其他办法了。

[ 本帖最后由 rocwoods 于 2008-10-28 15:16 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2008-10-29 01:19 | 显示全部楼层
我的数据中,坐标的确不是一个整数,
我觉得是不是可以用一个Loop,先用find标记坐标的位置,然后后一个值和前一个值比较,如果相同,就比较对应得value,如果不相同,就直接顺延到下一个。

可是我是刚开始学matlab,这个复杂的我实在是做不了。

谢谢楼上的帮助。
发表于 2008-10-29 01:24 | 显示全部楼层
如果不是整数可以通过乘以10的那次方解决

评分

1

查看全部评分

发表于 2008-10-29 10:26 | 显示全部楼层
不是整数的可以这样:

  1. UA = union(A(:,[1,2]),A(:,[1,2]),'rows' );
  2. nRowUA = size(UA,1);
  3. maxValue = zeros(nRowUA,1);
  4. for k = 1:nRowUA
  5. maxValue(k) = max( A( A(:,1)==UA(k,1) & A(:,2)==UA(k,2),3) );
  6. end
复制代码

[ 本帖最后由 rocwoods 于 2008-10-29 10:28 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2008-10-31 04:27 | 显示全部楼层
非常谢谢rocwoods的帮助,
我的问题已经解决啦,真是不知道怎么表达我的谢意!

以后还要多多请教!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-6-27 05:55 , Processed in 0.072691 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表