1)既に宣言されている定数であるにもかかわらず、なぜ渡さなければならないp
のですか?v
p
MATLAB のインライン関数オブジェクトにはeval
ラッパーがあるため、そのスコープ内の変数は、式から自動的にキャプチャされた変数または明示的に指定された変数のみです。
v
つまり、を認識したい場合は、オブジェクトを作成して明示的に渡すp
ときに宣言する以外に選択肢はありません。こちらも同様です!inline
v
f
2) t を 3*[(50*t+2)*sin(50*t+2)] として完全に v の式を取得するにはどうすればよいですか?
Shai が提案したように、無名関数を使用します。それらはより強力で、よりエレガントで、はるかに高速です。例えば:
v = @(t)(3*(50*t+2)*sin(50*t+2))
変数で既に使用されている名前を引数として使用すると、無名関数は最初にそれを引数として扱うことに注意してください。スコープ内の他の変数は表示されるため、次のようなg = @(x)(x + p)
ことも可能です。
編集#1:
これは別の例です。今回は関数の関数です:
x = 1:5;
f = @(x)(x .^ 3); %// Here x is a local variable, not as defined above
g = @(x)(x + 2); %// Here x is also a local variable
result = f(g(x));
または、代わりにそれを実装するさらに別の関数を定義します。
h = @(x)f(g(x)); %// Same result as h = @(x)((x + 2) .^ 3)
result = h(x);
出力は同じである必要があります。
編集#2:
式の文字列から無名関数を作成する場合は、「@(x)」(または適切と思われる適切な無名ヘッダー) を先頭に連結して適用しますeval
。次に例を示します。
expr = '(x + 2) .^ 3';
f = eval(['@(x)', expr]) %// Same result as f = @(x)((x + 2) .^ 3)
char(f)
文字列に変換することもできますが、手動でその'@(...)'
部分を取り除く必要があることに注意してください。
編集 #3:
別のソリューションを探している場合は、Symbolic Toolboxを調べることができます。たとえば、次を試してください。
syms x
f(x) = x + 2
g(x) = x ^ 3
またはsym
、次のように使用することもできます。
f(x) = sym('x + 2');
g(x) = sym('x ^ 3');
subs
値を置換し、シンボリック式を評価するために使用します。