уменьшение числа 0 строк в матрице с помощью matlab - PullRequest
1 голос
/ 06 ноября 2019

Я написал следующую программу в Matlab

clc;
clear all;
close all;

matrix = [ 0 0 0 0 0 0 0 0;
           0 0 0 0 0 0 0 0;
           0 0 0 0 0 0 0 0;
           1 1 1 1 1 1 1 1;
           1 1 1 0 0 1 1 1;
           0 0 1 1 1 1 1 1;
           0 0 0 0 0 0 0 0;
           0 0 1 1 1 1 1 1;
           0 0 0 0 0 0 0 0;
           0 0 1 1 1 1 1 1;
           1 0 0 1 1 1 1 1;
           1 1 1 0 0 0 1 1];

[row,column] = size(matrix);

for i = 1:row
         if matrix(i,:) == 0
         matrix(i,:) = [];
         end
end
disp(matrix);

Я ожидаю, что 0 строк будут удалены в выходной матрице. Где, как я получаю ошибку

Index in position 1 exceeds array bounds (must not exceed
8).

Error in Untitled (line 21)
         if matrix(i,:) == 0

>> 

Ответы [ 2 ]

4 голосов
/ 06 ноября 2019

Когда вы удаляете строку из матрицы, она больше не имеет row строк, а row-1. Поскольку вы не можете регулировать пределы цикла, вы будете индексировать вне диапазона. Кроме того, вы пропустите строку i+1, если удалите строку i.

Вместо этого сначала найдите все строки, которые необходимо удалить, а затем удалите их все сразу:

index = all(matrix == 0, 2);
matrix(index,:) = [];

Конечно, вы можете написать это в одной строке кода.

2 голосов
/ 06 ноября 2019

Как сказал @ Крис , причина того, что вы получаете ошибку выхода за границы, заключается в том, что вы удаляете с начала и сжимаете матрицу перед проверкой конца.

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

for i = row:-1:1   % loop from last row to first
         if matrix(i,:) == 0
         matrix(i,:) = [];
         end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...