Продвижение левой стороны оператора присваивания - PullRequest
0 голосов
/ 08 марта 2012

Я написал класс Matlab для обработки двойных чисел для выполнения автоматического дифференцирования . Почти во всех случаях это работает нормально, и новый класс является заменой для других числовых классов в большинстве функций (поле 'x' дает значения функции, а поле d - значение производной функция в этой точке.)

>> x = mkdual([1 2 3]);
>> x.^2
ans = 
  Dual

  Properties:
    x: [1 4 9]
    d: [2 4 6]

Однако происходит сбой, когда функция предварительно выделяет выходной массив и присваивает массиву путем индексации в нем. Например, в Matlab распространена следующая схема:

>> y=zeros(2) // Pre-allocate for speed
y =
     0     0
     0     0
>> x = 1;
>> y(1,:)=x
y =
     1     1
     0     0

К сожалению, это не работает с моим классом, поскольку он не может преобразовать массив в LHS оператора присваивания в двойное число:

>> x=mkdual(1);
>> y(2,:)=x
??? The following error occurred converting from Dual to double:
Error using ==> double
Conversion to double from Dual is not possible.

Может ли кто-нибудь предложить исправление или обходной путь - предпочтительно тот, который позволяет автоматически повышать значение переменной y до Dual?

Ответы [ 2 ]

2 голосов
/ 09 марта 2012

Ваш пример не терпит неудачу, потому что он не может повысить y до Dual;он терпит неудачу, потому что пытается преобразовать x в двойное число, и не может.

Если вы хотите это сделать, вы можете добавить перегруженный double метод к Dual, который будет выполнять преобразованиеоперация.

Я предполагаю, что это не то, что вы хотите, а скорее вы хотите способ предварительного выделения массива фиктивных элементов класса Dual.Для этого вы можете сконструировать конструктор Dual так, чтобы он работал без входных аргументов, возвращая фиктивный или по умолчанию Dual.Тогда вы можете сказать y(2,2) = Dual, и у вас будет 2x2 предварительно выделенный массив фиктивных Dual s.

Для более полного примера найдите в документе «Инициализация массивов объектов-значений».

В качестве альтернативы, вы можете сделать y массивом ячеек вместо массива.

1 голос
/ 08 марта 2012

Вы не сможете автоматически повысить y до Dual, если только вы не замените переменную полностью (что отрицательно сказывается на преимуществах предварительного распределения).

Однако вы должны иметь возможностьпредварительно выделить его как двойственный.Я не уверен в синтаксисе, и он может зависеть от вашей реализации, но что-то вроде:

mkdual(zeros(10,10))

В качестве альтернативы, вы можете сделать ленивое предварительное распределение циклом в обратном направлении.То есть вместо

for ix = 1:100
    y(ix) = mkdual(...)
end

используйте

for ix = 100:-1:1
    y(ix) = mkdual(...)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...