为实现自定义的function能有与类似plot函数一般的,输入时有说明文本的函数,本文进行了一些探索。本文分成问题描述、与功能实现两大部分。首先是简要描述了一下想要达成的具体效果,然后对从输入参数个数可变、使参数带有默认值、输入参数检测与最重要的说明文本\签名可选四个部分进行描述。最终效果如下:
事情的起因是我的导师要求我写一个linesearch的函数,形式参考fminunc。
我发现,其输入参数(inputs)和获得结果(outputs)有很多种形式,如下图所示:
很容易发现函数的输入输出参数随着调用的格式变化而变化。此外输入参数时,还会提示你能输入的参数,如下
不仅如此,更有如plot函数里面的用字符来控制我想输入或者说定义的变量:
多参数输入输出
首先是利用varargin函数形式如下
function options=funcoptions(x0,varargin)
其功能是将从第二个参数开始的数据保存到varargin的cell格式里面,具体可以自行doc varargin 。
这样就能实现多输入。多输出利用类似格式的varargout即可实现。
缺省参数
利用inputParser函数即可,具体可在matlab命令行里面输入doc inputParser查看文档。
其功能是检测输入参数,并且将其按照确定好的格式存到一个结构体里,下面给出一个小的例子:
这个例子想生成一个结构体option,其包含两个结构stepsize和OptimalityTolerance。输入为一个required value(必须输入的参数) x0和选项,这个选项就像plot函数里面的'color'等选项一样,是有缺省值的,用如下方式,在输入时用一个字符串代表修改项,后面跟着一个value即可修改。
plot(...,'color',[1 0 0])
function options=funcoptions(x0,varargin)
%一些缺省值的设定
[row,col]=size(x0);
default_epsilon=1e-6;
default_h= ones(row,col);%声明一个p为inputParser格式的。其实也可以理解为一个该格式的句柄一样的东西
p = inputParser;
addRequired(p,'x0');%把x0加到p里面,这个x0是必须有的。%接下来两个是可选参数,名字分别为’stepsize'和'OptimalityTolerance',如果没有检测到输入将有相应的缺省值defaulth和epsilon。这些都在函数开头声明好了
addParameter(p,'stepsize',default_h);
addParameter(p,'OptimalityTolerance',default_epsilon);%利用parse函数将输入参数与上面的进行匹配
parse(p,x0,varargin{:});%此时就已经生成好了一个inputParser格式的参数p,p里面含有不少东西,其中它的Results为一个结构体,是输入参数在匹配后的值,利用这个可以完成我的output的赋值
options.stepsize=p.Results.stepsize;
options.OptimalityTolerance=p.Results.OptimalityTolerance;
end
写好上述函数后可以试着调用
option=funcoptions([1 1],"OptimalityTolerance",0.001,"stepsize",[1 1]);
doc inputParser,里面有检测输入相应参数的检测说明
还是以刚刚给出的funcoptions为例,写完以后发现虽然我可以通过输入字符串进行匹配了,但是其实输入参数都是确定好的,那么如何想plot函数一样显示可选选项呢?
matlab的自定义代码建议和自动填充
里面有比较详细的说明,具体找寻方法如下doc validateFunctionSignaturesJSON,其说明最下面有。
通过写.json文件的方式能够实现在编辑器中调用相关函数时显示相应选项。还是以上面提到的函数为例,具体做法:
首先在你自定义的函数所在文件夹目录里,创建functionSignatures.json文件输入如下格式的代码即可:
{
"_schemaVersion": "1.0.0",
"funcoptions":
{
"inputs":
[
{"name":"input1", "kind":"required", "type":[["numeric"],["vector"]], "purpose":"初始向量"},
{"name":"stepsize", "kind":"namevalue", "type":[["numeric"],["vector"]],"purpose":"步长"},
{"name":"OptimalityTolerance", "kind":"namevalue", "type":["numeric"],"purpose":"允许误差"}
]
}
}
其中 "_schemaVersion": "1.0.0",为说明版本的,一般就这样就行,具体查看自定义代码建议和自动填充
"funcoptions":为你相应显示文本的函数名,如果你的函数叫MYFUNC那么就改为"MYFUNC"即可
"inputs"意味着对输入做出说明,name为参数的名字,当kind为required时,name是有顺序的,有很多kind。type是限定输入参数的。purpose是做出一些说明。
写好这个文件后效果如图
是不是一样了?成就感爆炸!