記号Toolboxは記号変数はスカラーであり、それらが存在する任意の操作または発現を要素単位のセマンティクスを使用すること観点から動作します。 subs
documentation内の状態として:
If old
is a scalar, and new
is a vector or matrix, then subs(s,old,new)
replaces all instances of old
in s
with new
, performing all operations elementwise. All constant terms in s
are replaced with the constant times a vector or matrix of all 1s.
だから、置換を受けた式は代入時に要素単位のアプリケーションや拡張で素晴らしいプレーする必要があります。しかし、置換される新しい配列がすべての次元でサイズが一致しない場合(係数行列が列ベクトルに対して長方形の場合のように)、次元の不一致がエンジンで発生する可能性がより高くなります。完全に準拠次元の置換がうまく動作しますが
>> wnum = [1 2 3 ;4 5 6; 7 8 9 ];
>> xnum = [1 2 3.44]';
>> bnum = [ 2 4 7 ]';
>> subs(f,{w,x,b},{wnum,xnum,bnum})
Error using symengine
New arrays must have the same dimensions or must be scalars.
Error in sym/subs>mupadsubs (line 140)
G = mupadmex('symobj::fullsubs',F.s,X2,Y2);
Error in sym/subs (line 125)
G = mupadsubs(F,X,Y);
:
>> subs(f,{w,x,b},{xnum,xnum,xnum}); % All 3x1
>> subs(f,{w,x,b},{wnum,wnum,wnum}); % All 3x3
そしてこのすべてを自分自身のように扱われているシンボリック変数から派生したセル配列の置換であっても直接指定でエラーが発生しますスカラー。もちろん
>> w = sym('w',[3,3]);
>> x = sym('x',[3,1]);
>> b = sym('b',[3,1]);
>> f = w*x - b;
>> subs(f,[w,x,b],[wnum,xnum,bnum])
ans =
333/25
766/25
1174/25
、最善の行動:シンボリック回避策は、配列の個々の要素を生成し、一対一の置換を可能にするためにシンボリック配列として変数を宣言することそうすることができれば、シンボリックツールボックスを完全に、または可能な限り避けることです。
>> double(subs(f,[w,x,b],[wnum,xnum,bnum]))
ans =
13.3200
30.6400
46.9600
>> fnum = wnum*xnum - bnum
fnum =
13.3200
30.6400
46.9600
上記の議論は、私はさておき、それに関連するパフォーマンス向上の全てから、実行時適切にMATLABに線形代数を残す理由としては非常に、非常に大きな理由です。私の意見では、シンボリックツールボックスは、1つ以上の変数(Taylor Series、Jacobians、およびHessiansを作成するために頻繁に使用する)または調査目的のための小さな次元の問題の高精度解析で、関数を分析するのが最善です。
実際、私は答えをemmm ......助けてください。 – Statham
答えは、 'subs'がスカラーを配列で置き換える方法の微妙なところにあります。質問に一貫して答えようとする前に、なぜ記号変数を使って始めていますか?あなたは 'f = @(w、x、b)w * x - b;'のような無名関数で 'double'と同様の振る舞いを使ってはるかに優れたパフォーマンスを得るでしょう。 – TroyHaskin
アドバイスをいただきありがとうございます。シンボリック変数を使用しています。これは、他の目的でxのデラバティブが必要な場合があるためです。匿名関数と二重変数を使用することができますか? – Statham