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)' (或您认为合适的正确匿名标头)连接到开头并 apply 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
替换值并计算符号表达式。