сообщение об ошибке по размерам матрицы в Matlab - PullRequest
1 голос
/ 01 января 2012

Когда я запускаю эту программу, я получаю сообщение об ошибке:

??? Индекс превышает размеры матрицы.
Ошибка в ==> если a (1, i) == 0

Не могли бы вы сказать мне, почему ??

a = randi(5,4,100)-ones(4,100);

[n m]=size(a);

for i=1:m
    if a(1,i)==0
        a(:,i)=[];
    end
end

Ответы [ 2 ]

3 голосов
/ 01 января 2012

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

Попробуйте вместо этого:

a = randi(5,4,100)-1;
ind2remove = (a(1,:) == 0);
a(:,ind2remove) = [];
0 голосов
/ 01 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...