Что не так с символическим назначением?
У меня большой код, и я заметил ошибку в моем коде без какой-либо синтаксической ошибки. Я описываю это на следующем примере:
I=sym(eye(3)); %I is Identity 3by3
a=sym(zeros(5,1)); %a is column matrix
затем:
a(1)=I;
который должен дать ошибку, но результат:
a=
1
0
0
0
0
это означает, что Matlab назначает матрицу 3x3 в элемент a
!!!
что случилось?
Я пробовал то же самое, но знаю, используя I
а также a
оба типа double теперь выдают ошибку, которая является правильной.
1 ответ
- Преобразовано из комментариев ---
В чем проблема
В общем, попытка назначить что-то размером 3x3 для меньшего массива вызовет ошибку Matlab. однако с sym происходит следующее:
I=sym(ones(3));
a=sym(zeros(5,1))
n=3
a(1:n)=I
a =
1
1
1
0
0
По какой-то причине с переменными класса sym
ошибка не вызывается. Если больше элементов дано в I
чем поместится в n
назначенные должности a
, Он назначит первый n
значения I
в a
Зачем
в subsasgn
метод для в classdef из sim (subsasgn
будучи методом, используемым для синтаксиса a(1)=I
) нет проверки размера присутствует (не совсем верно, как будто a
пустой sym
массив и ошибка вызвана) Функция перебирает n
места в a
назначив первый n
значения I
для каждой отдельной позиции в a
,
Например, приведенный выше код эквивалентен выполнению a(1:n)=I(1:n)
, которая будет командой для генерации этого поведения с double
,
Это предназначено?
Понятия не имею!
В справочной документации не упоминается об этом другом поведении, так что я предполагаю, что это ошибка, был добавлен запрос на обслуживание либо для документации, либо для исправления.
Что можно сделать
Будьте осторожны - извините, но это все, что мне нужно, чтобы избежать этой проблемы
РЕДАКТИРОВАТЬ - Ответ на запрос поддержки ---
Да ты прав; Я прошу прощения за неудобства, которые может вызвать это неожиданное поведение. Это действительно кажется несовместимым с базовым поведением MATLAB. Спасибо за то, что вы обратили на это наше внимание, так как это поведение должно быть задокументировано (если не выдается предупреждение). Я создам соответствующее усовершенствование документации сегодня.
... похоже, скоро это будет не ошибка, а документированное поведение