如何找出数组中的重复的数据?
比如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达到这个目的?
谢谢大家的帮助! 楼主如果用的是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 编辑 ] 我的数据中,坐标的确不是一个整数,
我觉得是不是可以用一个Loop,先用find标记坐标的位置,然后后一个值和前一个值比较,如果相同,就比较对应得value,如果不相同,就直接顺延到下一个。
可是我是刚开始学matlab,这个复杂的我实在是做不了。
谢谢楼上的帮助。 如果不是整数可以通过乘以10的那次方解决 不是整数的可以这样:
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 编辑 ] 非常谢谢rocwoods的帮助,
我的问题已经解决啦,真是不知道怎么表达我的谢意!
以后还要多多请教!
页:
[1]