2016-10-24 10 views
0

matlabでは単なる単純なケースですが、関数subs()について奇妙なことが起こりました。Matlab:シンプルなケースでは、シンボリックスカラー関数subs()を単純化できません

公式のヘルプドキュメントを読み、エラーメッセージをGoogleで検索しましたが、有用な情報が見つかりませんでした。

「subs(f)」というコマンドが間違っていると教えてもらえますか?ここで

>> syms x w b f 
>> f=x*w-b 
f = 
w*x - b 
>> w=[1 2 3 ;4 5 6; 7 8 9 ] 
w = 
    1  2  3 
    4  5  6 
    7  8  9 
>> x=[1 2 3.44]' 
x = 
    1.0000 
    2.0000 
    3.4400 
>> b=[ 2 4 7 ]' 
b = 
    2 
    4 
    7 
>> f 
f = 
w*x - b 
>> subs(f) 
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); 

はエラーメッセージのスクリーンショットである: enter image description here

+0

実際、私は答えをemmm ......助けてください。 – Statham

+0

答えは、 'subs'がスカラーを配列で置き換える方法の微妙なところにあります。質問に一貫して答えようとする前に、なぜ記号変数を使って始めていますか?あなたは 'f = @(w、x、b)w * x - b;'のような無名関数で 'double'と同様の振る舞いを使ってはるかに優れたパフォーマンスを得るでしょう。 – TroyHaskin

+0

アドバイスをいただきありがとうございます。シンボリック変数を使用しています。これは、他の目的でxのデラバティブが必要な場合があるためです。匿名関数と二重変数を使用することができますか? – Statham

答えて

1

記号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を作成するために頻繁に使用する)または調査目的のための小さな次元の問題の高精度解析で、関数を分析するのが最善です。

関連する問題