Matlab: удалить дубликаты значений
Я довольно новичок в программировании в целом и в 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, и это не то, что мне нужно.
Спасибо
3 ответа
Я видел решение с уникальным, и хотел дать решение с петлями. Вы можете посмотреть, какой из них быстрее: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
Вы можете сделать это используя 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
сохраняет последнее найденное уникальное значение, и выходные данные будут отсортированы. Это то, что вы хотите / имеете, так что вам повезло:)
Если это не то, что вы хотите / имеете, вам придется немного повозиться. Удаление дубликатов с сохранением порядка выглядит так:
% 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
...
который все еще сохраняет последнюю найденную запись. Если вы хотите сохранить первую найденную запись, используйте
% unique values, order preserved, keep first occurrence
[a,b,c] = unique(tmp2(:,1), 'first');
Использование unique
без 'rows'
вариант
[C ia ib] = unique( tmp2(:,1) );
C = tmp2( ia, : );