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, : );
Другие вопросы по тегам