nkscorpio 发表于 2008-10-28 06:25

如何找出数组中的重复的数据?

比如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达到这个目的?

谢谢大家的帮助!

rocwoods 发表于 2008-10-28 15:15

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

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

nkscorpio 发表于 2008-10-29 01:19

我的数据中,坐标的确不是一个整数,
我觉得是不是可以用一个Loop,先用find标记坐标的位置,然后后一个值和前一个值比较,如果相同,就比较对应得value,如果不相同,就直接顺延到下一个。

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

谢谢楼上的帮助。

adminftp 发表于 2008-10-29 01:24

如果不是整数可以通过乘以10的那次方解决

rocwoods 发表于 2008-10-29 10:26

不是整数的可以这样:
UA = union(A(:,),A(:,),'rows' );
nRowUA = size(UA,1);
maxValue = zeros(nRowUA,1);
for k = 1:nRowUA
maxValue(k) = max( A( A(:,1)==UA(k,1) & A(:,2)==UA(k,2),3) );
end


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

nkscorpio 发表于 2008-10-31 04:27

非常谢谢rocwoods的帮助,
我的问题已经解决啦,真是不知道怎么表达我的谢意!

以后还要多多请教!
页: [1]
查看完整版本: 如何找出数组中的重复的数据?