matlab - 没有 varargin 的 inputParser

标签 matlab

我想在函数f(a,b,c,d)上使用inputParser,其中a是强制的,b-d是可选的。我想保留 b-d 命名 = 不使用 f(a, varargin),因为当您实际想要使用该函数时,varargin 不会告诉您任何信息。除非给出所有 4 个参数,否则简单的 p.parse(a,b,c,d) 显然不起作用。

我知道如何执行此操作的唯一方法是使用 setDefaultValue(argname, value),然后使用 p.parse(...) 检查是否需要。但是有没有一种简单的方法可以仅使用 inputParser(无需大量 if)来破解此问题?

顺便问一下,没有像 MATLAB 中的 C# 那样简单的方法来执行命名参数,对吗?所以我会拥有 f(a,b,c,d) 并按原样使用。第一个参数是 a,然后是 b,然后是 c ...但是当用户想要像 f(a, 'd', 3, 'c', 2) 那样调用它时,他可以。在此示例中,他将保留默认 b 并使用 3 表示 d,使用 2 表示 c。当然,我这边没有大量的工作 - 我知道该怎么做,编写我自己的解析,但我想要一个更简单的解决方案(就像其他人的解析:))

最佳答案

我会给你一个替代答案:不要偷懒,写文档。

如果你这样做:

function [out]= foo(a,b,c,d)
%FOO does foo things
%
% FOO(a,b) does very foo thins to a and b
%
% FOO(a,b,c) is quite foo-y on c also
%
% FOO(a,b,c,d) c and d are optional FOO things

if (nargin==3)
...

然后,如果用户按 F1 或输入 help foo,他们将获得注释中的所有信息。


为了让用户能够在我的代码中输入诸如 foo(1,2,'d',5) 之类的输入,我使用以下 "inputparser"可选参数:

function [c,d]=parse_inputs(argin)
opts=     {'c','d'};
defaults=ones(length(opts),1);
% Check inputs
nVarargs = length(argin);
if mod(nVarargs,2)
    error('InvalidInput','Invalid number of inputs')
end

% check if option has been passed as input
for ii=1:2:nVarargs
    ind=find(ismember(opts,lower(argin{ii})));
    if ~isempty(ind)
        defaults(ind)=0;
    else
       error('InvalidInput',['Optional parameter "' argin{ii} '" does not exist' ]); 
    end
end

for ii=1:length(opts)
    opt=opts{ii};
    default=defaults(ii);
    % if one option is not default, then extrac value from input
    if default==0
        ind=double.empty(0,1);jj=1;
        while isempty(ind)
            ind=find(isequal(opt,lower(argin{jj})));
            jj=jj+1;
        end
         if isempty(ind)
            error('InvalidInput',['Optional parameter "' argin{jj} '" does not exist' ]); 
        end
        val=argin{jj};
    end

    switch opt
        case 'c': 
          if default;
             c=4;
          else
             c=val;
          end
     ...
     otherwise
            error('InvalidInput',['Invalid input name:', num2str(opt),'\n No such option in SART()']);
    end
end

然后我在 foo 中做的第一件事是:

[c,d]=parse_inputs(varargin);

关于matlab - 没有 varargin 的 inputParser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42667004/

相关文章:

image - 使用Matlab将图像打印为无边距的pdf

matlab - 在纸上以精确尺寸打印 MATLAB 图

matlab - 中心裁剪或填充帧内的图像

matlab - MATLAB 中的特征选择

matlab - 显示图像时,Colorbar 限制不尊重轴 clims

matlab - MATLAB 中 voronoi 图的彩色无界单元

matlab - 所有可能的组合,使得所有数字的总和为固定数字

matlab - 如何将向量转换为矩阵,其中列上的值为 1,其中列号是向量元素,否则为 0?

python - MATLAB 的 fmincon 函数的开源替代方案?

python - matlab 的 fminsearch 的 numpy/scipy 模拟