MATLAB 自定义function 显示如同plot等自带函数的选项格式 实现函数可选输入参数(参数可变)、含有默认(缺省)参数、检查输入(参数检测)、显示更多签名(.json控制)

摘要

        为实现自定义的function能有与类似plot函数一般的,输入时有说明文本的函数,本文进行了一些探索。本文分成问题描述、与功能实现两大部分。首先是简要描述了一下想要达成的具体效果,然后对从输入参数个数可变、使参数带有默认值、输入参数检测与最重要的说明文本\签名可选四个部分进行描述。最终效果如下:

MATLAB 自定义function 显示如同plot等自带函数的选项格式 实现函数可选输入参数(参数可变)、含有默认(缺省)参数、检查输入(参数检测)、显示更多签名(.json控制)_第1张图片

问题描述

事情的起因是我的导师要求我写一个linesearch的函数,形式参考fminunc。

我发现,其输入参数(inputs)和获得结果(outputs)有很多种形式,如下图所示:

MATLAB 自定义function 显示如同plot等自带函数的选项格式 实现函数可选输入参数(参数可变)、含有默认(缺省)参数、检查输入(参数检测)、显示更多签名(.json控制)_第2张图片

很容易发现函数的输入输出参数随着调用的格式变化而变化。此外输入参数时,还会提示你能输入的参数,如下

MATLAB 自定义function 显示如同plot等自带函数的选项格式 实现函数可选输入参数(参数可变)、含有默认(缺省)参数、检查输入(参数检测)、显示更多签名(.json控制)_第3张图片

不仅如此,更有如plot函数里面的用字符来控制我想输入或者说定义的变量:

MATLAB 自定义function 显示如同plot等自带函数的选项格式 实现函数可选输入参数(参数可变)、含有默认(缺省)参数、检查输入(参数检测)、显示更多签名(.json控制)_第4张图片

 功能实现

多参数输入输出

首先是利用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是做出一些说明。

写好这个文件后效果如图

MATLAB 自定义function 显示如同plot等自带函数的选项格式 实现函数可选输入参数(参数可变)、含有默认(缺省)参数、检查输入(参数检测)、显示更多签名(.json控制)_第5张图片

是不是一样了?成就感爆炸! 

你可能感兴趣的:(matlab)