提升赋值运算符的左侧

时间:2012-03-08 18:56:06

标签: oop matlab

我编写了一个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吗?

2 个答案:

答案 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