如何从函数句柄获取arglist?

时间:2015-04-21 21:59:58

标签: matlab function arguments handle

我有以下功能句柄

 fun = @(x,y,z)[x.^3+y.^2+z.^2,x.^2-y.^3+sin(z)]

现在我正在使用该功能

jacobian(fun, [x,y,z])

返回函数的jacobian。要使用此功能,我首先需要定义

syms x y z. 

如果功能变为

@(x,y,z,w)[x.^3+y.^2+z.^2+w,x.^2-y.^3+sin(z)+w] 

jacobian由

返回
jacobian(fun, [x,y,z,w]). 

现在我不想手动更改jacobian的第二个输入参数。在Matlab中是否有一个函数,它查看函数句柄并返回它们,或返回有多少函数?

非常感谢!

2 个答案:

答案 0 :(得分:1)

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

编辑:非常感谢路易斯·门多的评论。

您需要添加以下内容:

sym(strVar(:))

将它们声明为符号变量,或直接声明:

jacobian(fun, sym(strVar))

计算你的jacobian。

答案 1 :(得分:1)

你可以这样做:

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]