2012-03-08 58 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