我对编程和MATLAB相当新,我在从矩阵中删除值时遇到了一些问题。
我的矩阵tmp2的值为:
tmp2 = [... ...
0.6000 20.4000
0.7000 20.4000
0.8000 20.4000
0.9000 20.4000
1.0000 20.4000
1.0000 19.1000
1.1000 19.1000
1.2000 19.1000
1.3000 19.1000
1.4000 19.1000
... ...];
如何删除左栏中有1.0的部分,但右边的值是不同的?我想用19.1保存行。我搜索了解决方案,但发现一些使用histc函数删除这两行,而这不是我需要的。
由于
答案 0 :(得分:8)
您可以使用unique
:
>> [~,b] = unique(tmp2(:,1)); % indices to unique values in first column of tmp2
>> tmp2(b,:) % values at these rows
ans =
0.6000 20.4000
0.7000 20.4000
0.8000 20.4000
0.9000 20.4000
1.0000 19.1000
...
默认情况下,unique
会保存找到的 last 唯一值,输出将排序。这恰好是你想要/拥有的,所以你很幸运:)
如果不你想要/拥有什么,你将不得不再修补一下。删除保留订单的重复项如下:
% mess up the order
A = randperm(size(tmp2,1));
tmp2 = tmp2(A,:)
% use third output of unique
[a,b,c] = unique(tmp2(:,1));
% unique values, order preserved
tmp2(b(c),:)
ans =
1.1000 19.1000
1.2000 19.1000
1.0000 20.4000
0.7000 20.4000
1.0000 20.4000
1.4000 19.1000
0.6000 20.4000
0.9000 20.4000
1.3000 19.1000
0.8000 20.4000
...
仍保留找到的 last 条目。如果要保留第一个条目,请使用
% unique values, order preserved, keep first occurrence
[a,b,c] = unique(tmp2(:,1), 'first');
答案 1 :(得分:6)
使用unique
而不使用'rows'
选项
[C ia ib] = unique( tmp2(:,1) );
C = tmp2( ia, : );
答案 2 :(得分:1)
我看到了独特的解决方案,并希望提供一个带循环的解决方案。你可以看看哪一个更快:D!循环可能会改善......
clear
tmp = [0.6000 20.4000
0.7000 20.4000
0.8000 20.4000
0.9000 20.4000
1.0000 20.4000
1.0000 19.1000
1.1000 19.1000
1.2000 19.1000
1.3000 19.1000
1.4000 19.1000];
ltmp = length(tmp);
jj = 1;
for ii = 1 : ltmp
if ii > 1
if tmp(ii, 1) == tmp(ii - 1, 1)
continue
end
end
if ii < ltmp
if tmp(ii, 1) == tmp(ii + 1, 1)
tmp2(jj,1) = tmp(ii, 1);
tmp2(jj,2) = min(tmp(ii, 2),tmp(ii + 1, 2));
else
tmp2(jj, 1) = tmp(ii, 1);
tmp2(jj, 2) = tmp(ii, 2);
end
else
tmp2(jj, 1) = tmp(ii, 1);
tmp2(jj, 2) = tmp(ii, 2);
end
jj = jj + 1;
end