2012-03-08 6 views
0

dual numbersを処理してautomatic differentiationを処理するMatlabクラスを作成しました。ほとんどの場合、これはうまく動作し、新しいクラスはほとんどの関数の他の数値クラスのドロップイン置換です(フィールド 'x'は関数の値を与え、フィールドdは導関数の値を与えます)。その点での関数)代入演算子の左辺を宣伝する

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

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

しかし、それは関数は、出力アレイを事前に割り当てる場合に失敗し、それにインデックスを付けることによって、アレイに割り当てます。たとえば、次は、MATLABでの一般的なパターンです:それは二重の数に代入演算子のLHS上のアレイを促進することはできませんので、

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

は、残念ながら、これは、私のクラスで失敗します。

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

それはDualyを促進することはできませんので、あなたの例では、障害が発生していないのです。 xをダブルに変換しようとしているため失敗しています。

これを実行する場合は、変換操作を行うにオーバーロードされたdoubleメソッドを追加できます。

私はそれがあなたが望むものではないと思っていますが、むしろクラスDualのダミー要素の配列を事前に割り当てる方法が必要です。これを行うには、Dualというコンストラクタを設計して、入力引数なしで実行し、ダミーまたはデフォルトのDualを返します。次に、y(2,2) = Dualと言うことができ、2x2の事前割り振り済みのダミー配列があります。

詳細な例については、ドキュメントで「値オブジェクトの配列を初期化する」を検索してください。

yを配列の代わりにセル配列にすることもできます。

+0

これはきちんとした考えです、ありがとう。 –

1

yDualに自動的に昇格させることはできませんが、変数全体を置き換えない限り(事前割り当てのメリットを打ち消します)。

ただし、最初にデュアルとして事前に割り当てることができます。私は、構文のわからないんだけど、それはあなたの実装に依存してもよいが、何かのように:また

mkdual(zeros(10,10)) 

、あなたは後方ループによって遅延事前割り当てを行うことができます。それは代わりに

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

使用

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

答えをありがとう。私は、デュアル・ナンバーとして関連する事前配分を行う「デュアル・バージョン」に私の機能のいくつかを書き直すことになるかもしれないと思う。関数に何も変更せずに引数としてデュアル配列にドロップすることができた解決策があることを期待していましたが、残念ながら存在しないようです。受け入れられる「次善の」解決法は、関数が正規の数値とデュアル数値の両方で機能するように関数を再ジグすることですが、その可能性についてはわかりません。 –

関連する問題