Что не так с символическим назначением?

У меня большой код, и я заметил ошибку в моем коде без какой-либо синтаксической ошибки. Я описываю это на следующем примере:

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. Спасибо за то, что вы обратили на это наше внимание, так как это поведение должно быть задокументировано (если не выдается предупреждение). Я создам соответствующее усовершенствование документации сегодня.

... похоже, скоро это будет не ошибка, а документированное поведение

Другие вопросы по тегам