2013-05-28 3 views
4

Я довольно новичок в программировании вообще и 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, и это не то, что мне нужно.

Благодаря

+0

Решен, спасибо :) – dsp

ответ

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 
+5

Если вы считаете, что ваш цикл лучше, чем 'unique': show он использует небольшой ориентир. В противном случае просто посмотрите на код и скажите мне, что это лучше, чем 'уникальное' решение ... Кроме того, [Лучше не использовать' i' и 'j' как имена переменных в Matlab] (http: // stackoverflow. ком/вопросы/14790740/с помощью-я-и-J-как-переменные-в-MATLAB). – Shai

+2

Единственный способ, которым я вижу это, может быть «лучше» в том, что он всегда дает минимальное значение, а не первое или последнее как «уникальное». Он также не сортирует результаты, но это может быть легко достигнуто и с уникальным. –

6

использование unique без 'rows' опции

[C ia ib] = unique(tmp2(:,1)); 
C = tmp2(ia, :); 
7

Вы можете сделать это с помощью 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'); 
+4

Я бы рекомендовал использовать '' unique' с SetOrder' = ' 'stable'', чтобы сохранить порядок. –

+0

@DennisJaheruddin: правда, хотя эта опция доступна только в новых версиях Matlab (не знаю, какая версия точно начала ее включать, но, по крайней мере, не в R2010a) –

Смежные вопросы