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

#matlab #indexing

#matlab #индексирование

Вопрос:

Я получаю сообщение об ошибке

 ???  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. Интересно, имеет ли значение значение s {i, 3}. Что это?

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

3. код с моей стороны отлично работает как есть, вам действительно нужно показать больше информации. установите точку останова до и в цикле for и узнайте историю с s и C

Ответ №1:

Хорошо, итак, вот что происходит. s вероятно, инициализируется пустой ячейкой (ПРИМЕЧАНИЕ: необязательно быть полностью пустой — см. Последний абзац). Итак, индексирование элемента s as 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, и поэтому вы получаете ошибку index out of bounds.


ПРИМЕЧАНИЕ:

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. Это то, что я подумал, но, согласно комментарию OP, s {i, 3} содержит значение 6 во время исключения.

2. @Amac: Я только что увидел этот комментарий, и я думаю , что OP может ошибаться в этом. Если бы это было так, OP не должен был выдавать ошибку, потому что MATLAB просто увеличивает массив в случае назначения. Ближайшее сообщение об ошибке в этом случае — «Индекс превышает размеры матрицы». Часть «… элемент для удаления …» ясно показывает, что происходит некоторое удаление через присвоение пустой матрице.

3. Это ошибка. Предполагается, что единственный способ выполнить удаление круглых скобок — это присвоить литералу «[]». Например, x=[]; y(i)=x; не будет выполнять удаление paren, но y(i)=[]; будет. Я зарегистрировал ошибку (я работаю в MathWorks).

4. @SCFrench: Спасибо за ваш комментарий и поднятие проблемы в Mathworks.