如何从函数句柄中获取 arglist?
How to get arglist from a function handle?
我有以下函数句柄
fun = @(x,y,z)[x.^3+y.^2+z.^2,x.^2-y.^3+sin(z)]
现在我正在使用函数
jacobian(fun, [x,y,z])
其中 returns 函数的雅可比矩阵。要使用此功能,我首先需要定义
syms x y z.
如果函数变为
@(x,y,z,w)[x.^3+y.^2+z.^2+w,x.^2-y.^3+sin(z)+w]
雅可比矩阵由
返回
jacobian(fun, [x,y,z,w]).
现在我不想手动更改 jacobian 的第二个输入参数。 Matlab 中是否有一个函数,它查看函数句柄和 returns 它们,或者 returns 有多少?
非常感谢!
functions
函数和快速正则表达式可以帮助您:
fun = @(x,y,z,w)[x.^3+y.^2+z.^2+w,x.^2-y.^3+sin(z)+w] ;
s = functions(fun) ;
strVar = strsplit( char( regexp(s.function, '\(([^\)]+)\)' , 'tokens' , 'once' )) ,',') ;
nInput = numel(strVar) ;
会给你:
>> strVar
strVar =
'x' 'y' 'z' 'w'
>> nInput
nInput =
4
编辑:非常感谢 Luis Mendo 的评论。
您需要添加如下内容:
sym(strVar(:))
将它们声明为符号变量,或者直接:
jacobian(fun, sym(strVar))
计算你的雅可比矩阵。
你可以这样做:
str = func2str(fun); %// get fun's defining string
str = regexp(str, '^@\([^\)]+\)', 'match'); %// keep only "@(...)" part
vars = regexp(str{1}(3:end-1), ',', 'split'); %// remove "@(" and ")", and split by commas
jacobian(fun, sym(vars)); %// convert vars to sym and use it as input to jacobian
示例:
>> clear all
>> syms r s t
>> fun = @(r,s,t) [r*s^t r+s*t]
fun =
@(r,s,t)[r*s^t,r+s*t]
>> str = func2str(fun);
str = regexp(str, '^@\([^\)]+\)', 'match');
vars = regexp(str{1}(3:end-1), ',', 'split');
jacobian(fun, sym(vars))
ans =
[ s^t, r*s^(t - 1)*t, r*s^t*log(s)]
[ 1, t, s]
我有以下函数句柄
fun = @(x,y,z)[x.^3+y.^2+z.^2,x.^2-y.^3+sin(z)]
现在我正在使用函数
jacobian(fun, [x,y,z])
其中 returns 函数的雅可比矩阵。要使用此功能,我首先需要定义
syms x y z.
如果函数变为
@(x,y,z,w)[x.^3+y.^2+z.^2+w,x.^2-y.^3+sin(z)+w]
雅可比矩阵由
返回jacobian(fun, [x,y,z,w]).
现在我不想手动更改 jacobian 的第二个输入参数。 Matlab 中是否有一个函数,它查看函数句柄和 returns 它们,或者 returns 有多少?
非常感谢!
functions
函数和快速正则表达式可以帮助您:
fun = @(x,y,z,w)[x.^3+y.^2+z.^2+w,x.^2-y.^3+sin(z)+w] ;
s = functions(fun) ;
strVar = strsplit( char( regexp(s.function, '\(([^\)]+)\)' , 'tokens' , 'once' )) ,',') ;
nInput = numel(strVar) ;
会给你:
>> strVar
strVar =
'x' 'y' 'z' 'w'
>> nInput
nInput =
4
编辑:非常感谢 Luis Mendo 的评论。
您需要添加如下内容:
sym(strVar(:))
将它们声明为符号变量,或者直接:
jacobian(fun, sym(strVar))
计算你的雅可比矩阵。
你可以这样做:
str = func2str(fun); %// get fun's defining string
str = regexp(str, '^@\([^\)]+\)', 'match'); %// keep only "@(...)" part
vars = regexp(str{1}(3:end-1), ',', 'split'); %// remove "@(" and ")", and split by commas
jacobian(fun, sym(vars)); %// convert vars to sym and use it as input to jacobian
示例:
>> clear all
>> syms r s t
>> fun = @(r,s,t) [r*s^t r+s*t]
fun =
@(r,s,t)[r*s^t,r+s*t]
>> str = func2str(fun);
str = regexp(str, '^@\([^\)]+\)', 'match');
vars = regexp(str{1}(3:end-1), ',', 'split');
jacobian(fun, sym(vars))
ans =
[ s^t, r*s^(t - 1)*t, r*s^t*log(s)]
[ 1, t, s]