2014-12-31 2 views
1

У меня есть матрица в MATLAB следующим образом:Удалить строки встречи конкретных условий

A = [ 0, 0, 0; 
     1, 2, 3; 
     4, 2, 3; 
     0, 0, 0; 
     1, 3, 4 ]; 

Я хотел бы, чтобы удалить нули из строки 1 и линии 4, так что я могу получить следующую матрицу:

B = [ 1, 2, 3; 
     4, 2, 3; 
     1, 3, 4 ]; 

То, что я сделал следующий:

for i = 1:length(A) 
    if (sum(A(i, :)) == 0) 
     A(i, :) = []; 
    end 
end 

Я знаю, что проблема заключается в том, что A меняется в s- ize, так что это проблема. К сожалению, я не могу это исправить. Не могли бы вы дать мне какой-то намек.

+0

Ваш подход будет работать только если предположить, что у вас нет ни одной строки в вашей матрице этой суммы к нулю. Будет ли ваш подход работать, если бы у нас была следующая матрица: 'A = [-1 1 0; 1 0 -1];Вы ищете удаление строк, которые ** sum ** равны нулю или содержат только нули? – rayryeng

+0

Я хотел бы удалить строки, которые являются нулями. В моей матрице нет отрицательного значения. Спасибо за ваш ответ @rayryeng. Я понимаю свою ошибку. – user199027

ответ

3

Подход Kamtal будет работать, если у вас нет строк, суммированных до нуля. Чтобы быть более безопасным, вы должны проверить, содержит ли строка только нулей. Другими словами, попробуйте сделать это:

A(~any(A,2), :) = []; 

any проверяет, является ли массив или матрица имеет любой из его элементов не равно нулю, который выдает логический true и false иначе. Если вы используете any над матрицей, вы можете указать, хотите ли вы проверить это по строкам или столбцам во втором параметре any. В вашем случае вы хотите использовать столбцы для каждой строки, поэтому вы должны указать второй параметр равным 2.

Поскольку вы хотите проверить, не содержит ли любая строка всех нулей, вы должны использовать any над колоннами и проверить обратное. Таким образом, any будет выводить логический false, если все строки состоят только из нулей. Это то, что мы ищем, но вы хотите, чтобы это было true, а не false, и поэтому мы инвертируем с помощью ~, поскольку мы обратимся к тому, что мы ищем.


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

Другими словами, это сделать:

i = 1; 
while i < length(A) 
    if (sum(A(i, :)) == 0) 
     A(i, :) = []; 
     continue; 
    end 
    i = i + 1; 
end 
5

Если вы хотите удалить строки с нулевой суммой, это может помочь,

A(sum(A,2)==0,:)=[]; 

Как упомянуто @LuisMendo вы можете использовать

A(all(A,2)==0,:)=[]; 

в зависимости от того, какие критерии вы имеете в виду.

+2

Чтобы удалить строки, содержащие все нули: 'A (все (A, 2) == 0,:) = [];' –

+0

@ Потенциальная полость Kamtal. Что делать, если у вас была строка, содержавшая суммы, которые были отменены до нуля? Например, что произойдет, если бы у нас была такая матрица, что: A = [-1 1 0; -1 0 1] '? – rayryeng

+0

@ LuisMendo - О, ничего себе. Я не видел твой комментарий! Вы хотите, чтобы я удалил свой ответ? – rayryeng

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