2012-03-08 73 views
0

我写了一个Matlab类来处理dual numbersautomatic 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. 

任何人都可以提出一个修复或解决方法 - 最好是允许自动推广变量yDual

回答

2

你的例子不是没有,因为它不能促进yDual;它失败了,因为它试图将x转换为双精度,而不能。

如果你想这样做,你可以添加一个超载的double方法Dual将做转换操作。

我猜这不是你想要的,而是你想要一种预分配类的虚拟元素数组的方式。要做到这一点,您可以设计构造函数Dual,这样它将在没有输入参数的情况下运行,返回一个虚拟或默认的Dual。然后你可以说y(2,2) = Dual,你将有一个2x2的预分配虚拟阵列Dual s。

在文档中搜索“初始化值对象的数组”以获得更完整的示例。

或者,您可以使y为单元数组而不是数组。

+0

这是一个整洁的想法,谢谢。 – 2012-03-08 23:36:00

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 
+0

感谢您的回答。我怀疑我最终可能会将我的某些功能重写为“双版本”,将相关的预分配作为双重数字。我希望能有一个解决方案,让我可以在双数组中作为参数下降,而不需要对函数做任何修改,但是可惜的是似乎没有。一个可以接受的“次优”解决方案是重新调整功能,以便它们可以同时使用正常和双重数字,但我不确定这将是多么可能。 – 2012-03-08 21:23:51