我编写了一个Matlab类来处理dual numbers来做automatic differentiation。对于几乎所有情况,这都可以正常工作,并且新类是大多数函数中其他数字类的替代品(字段'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
吗?
答案 0 :(得分:2)
您的示例没有失败,因为它无法将y
提升为Dual
;它失败了,因为它试图将x
转换为double,而不能。
如果您想这样做,可以将重载的double
方法添加到Dual
进行转换操作的方法。
我猜这不是你想要的,而是你想要一种预先分配类Dual
的虚拟元素数组的方法。为此,您可以设计Dual
的构造函数,以便它将在没有输入参数的情况下运行,返回虚拟或默认Dual
。然后你可以说y(2,2) = Dual
并且你将有一个2x2预分配的虚拟Dual
数组。
在文档中搜索“初始化值对象的数组”以获得更完整的示例。
或者,您可以使y
成为单元格数组而不是数组。
答案 1 :(得分:1)
您将无法自动将y
提升为Dual
,除非您完全替换该变量(这会破坏预分配的好处)。
但是,您应该能够首先将其预先分配为Dual。我不确定语法,它可能取决于您的实现,但类似于:
mkdual(zeros(10,10))
或者,您可以通过循环向后执行惰性预分配。也就是说,而不是
for ix = 1:100
y(ix) = mkdual(...)
end
使用
for ix = 100:-1:1
y(ix) = mkdual(...)
end