2014-02-17 6 views
1

У меня есть матрица, которая выглядит как:MATLAB: удаление некоторых из элементов матрицы

A =[ 
    1 5 
    2 10 
    3 12 
    4 25 
    5 8] 

Давайте предположим, что я хочу, чтобы удалить строки, которые содержат элементы, которые больше, чем 10. Я пытался использовать цикл и просто читать матрицу и использовать

for ii = 1:5 
    for jj = 2 
     if A(ii,jj) > 10 
     A(ii,2) = []; 
     end 
    end 
end 

Проблема заключается в том, что я все время получаю ошибки относительно размера матрицы. Когда одна строка удаляется, размер матрицы уменьшается, и я знаю, что мне нужно установить size(A)=size(A)-1, но это не сработает. Любая помощь приветствуется!

+1

Кстати: Если размер матрицы может изменения в одной итерации цикла можно считать от конца к началу матрицы чтобы избежать доступа элемента, который не выходит. Но это всего лишь общий намек, а не решение проблемы, потому что я уже видел, что есть ответ. – 13aumi

ответ

4

Вы не можете удалить один элемент при использовании индекс обозначения, так что ваша ошибка здесь:

A(i,2) = []; 

У вас есть два варианта, либо удалить всю строку:

A(i,:) = []; 

или еще линеаризовать вашу матрицу и удалить отдельные элементы (но тогда вы не сможете восстановить оригинальную форму:

for ii = numel(A):-1:1 
    if A(ii) > 10 
     A(ii) = []; 
    end 
end 

, но использование цикла для этого не является необходимым и, вероятно, неэффективным. Вы можете сделать это с помощью логической индексации следующим образом:

A(any(A'>10),:) = []; 

удалить всю строку, либо просто удалить отдельные элементы попробовать:

A(A>10) = [] 

, но тогда вы увидите, что вы в конечном итоге с линейный (линеаризованный) результат

+0

Ну, это была ошибка при наборе текста. Я пробовал это, но я получаю эту ошибку: Попытка получить доступ к A (10); index out of bounds, потому что numel (A) = 9. – elhmo

+0

@elhmo да, что произойдет в цикле. Цикл - плохой путь. Я обновляю цикл, поэтому имеет смысл, но в основном он должен быть запущен снизу вверх, чтобы вы не пропускали элементы, так как удаление элемента ударяет все элементы после него выше – Dan

+0

ok, второй вариант работает отлично. Спасибо – elhmo

0

Вот решение, очень похожее на решение @Dan. В основном это держит то, что вы хотите, вместо того, чтобы извлекать то, что вы не хотите:

A(all(A<=10,2),:) 
+0

спасибо. Это мило! – elhmo

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