matlab: «Индекс удаляемого элемента превышает размеры матрицы». Когда я не удаляю элементы - PullRequest
2 голосов
/ 30 мая 2011

я получаю ошибку

???  Index of element to remove exceeds matrix dimensions.

Error in ==> myfile at 111
    C(i)=s{i,3};

код:

C=zeros(num_of_tris,1);
for i=1:size(C,1)
    C(i)=s{i,3};
end

Я не показываю код для создания s, но я предполагаю, что он не соответствует точке, так как s появляется только в правой части назначения ...

почему там написано element to remove? какой элемент я удаляю?

1 Ответ

4 голосов
/ 30 мая 2011

Хорошо, вот что происходит. s вероятно инициализируется пустой ячейкой (ПРИМЕЧАНИЕ: не обязательно должен быть полностью пустым - см. Последний абзац). Таким образом, индексирование элемента s как s{i,3} возвращает []. Операция MATLAB для удаления элемента вектора:

C(i)=[];

Таким образом, когда вы проходите цикл, вы удаляете элементы C один за другим, и в итоге индекс i превышает размер (теперь уменьшенного) вектора.

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

s=cell(10,5);           %#initialize s to an empty cell
%#note that any cell returns []
s{3,4}

ans =

     []

%#This is your code from above
C=zeros(10,1);          %#initialize C
for i=1:size(C,1)
    C(i)=s{i,3};
end

??? Индекс удаляемого элемента превышает размеры матрицы.

Вы увидите, что индекс i, когда вы получите эту ошибку numel(C)/2+1. Другими словами, до i=5 (в этом примере) вы удаляете каждый нечетный элемент C, а при i=6 количество элементов, остающихся в C, равно 5, и поэтому вы получаете индекс ошибки границ.


Примечание:

s даже не должно быть полностью пустым. Рассмотрим этот пример:

s=cell(10,1);
s([1,2,6,8])=num2cell(rand(4,1));
C=zeros(10,1);
for i=1:numel(C)
    C(i)=s{i};
end
* 1 034 * ??? Индекс удаляемого элемента превышает размеры матрицы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...