波浪线操作符在输入参数中的正确使用方法

9

功能:

我的MATLAB函数有一个输出和多个输入参数,其中大部分是可选的,即:

output=MyFunction(arg1,arg2,opt1,opt2,...,optN)

我想要做什么:

我想要只给函数传入arg1、arg2和最后一个可选的输入参数optN。我使用了波浪线运算符来实现:

output=MyFunction(str1,str2,~,~,...,true)

不期望的结果:

这将给出以下错误消息:

Error: Expression or statement is incorrect--possibly unbalanced (, {, or [.

这个错误指向第一个波浪线后面的逗号,但是说实话我不知道该怎么处理。
问题识别:
- 我使用支持波浪线运算符的MATLAB 2013b版本。 - 根据MATLAB的文档,上述函数调用应该可以正常工作: “您可以忽略任何数量在参数列表中的函数输入。用逗号分隔连续的波浪线...” - 我猜有几种解决方法,例如使用''或[]作为输入,但我真的很想了解如何正确使用'~',因为实际上留下输入允许我在检查函数的输入参数时使用exist()。 如果您需要更多信息,请告诉我。
非常感谢!
2个回答

9
波浪号仅用于函数声明。Matlab的mlint建议用~替换未使用的参数。结果是像这样声明函数:function output = MyFunction(a, b, ~, c)。这是一个非常糟糕的做法。
由于您的函数中参数是可选的,因此必须使用空参数调用函数:output=MyFunction(str1,str2,[],[],...,true)
更好的方法是使用varargin参数声明函数并为不同的输入准备您的函数:
function output = MyFunction(varargin)

if nargin == 1
    % Do something for 1 input
elseif nargin == 2
    % Do something for 3 inputs
elseif nargin == 3
    % Do something for 3 inputs
else
    error('incorrect number of input arguments')
end

你甚至可以这样声明你的函数:

function output = MyFunction(arg1, arg2, varargin)

上面的声明将告诉Matlab您期望至少两个参数。

在此处查看nargin的文档

...以及varargin的文档


@lakesh 感谢您的回复,非常有用。虽然我在函数定义中使用nargin来确保用户输入所有必需的输入,但我决定不使用varargin,因为它不允许分配描述性变量名称,例如strBenchmark。我一直认为描述性名称可以使其他用户更容易理解,因为它们在键入函数名称时显示在小弹出窗口中。我会考虑使用[]或varargin。再次感谢! - DMueller
1
@DMueller 是的,varargin 不允许使用描述性变量名。我总是将 varargin 的输入复制到具有描述性名称的变量中。不得不复制变量也不好(浪费一些内存),但考虑到限制,这是我认为最好的选择 :) - gire
@lakesh 我强烈不同意。在编程时,明确表达非常重要。这包括变量名、函数名、类名等。 - gire

4
使用 varargin 可以传递可变数量的输入参数。与之搭配使用的是 nargin。
示例代码如下:
function varlist2(X,Y,varargin)
   fprintf('Total number of inputs = %d\n',nargin);

   nVarargs = length(varargin);
   fprintf('Inputs in varargin(%d):\n',nVarargs)
   for k = 1:nVarargs
      fprintf('   %d\n', varargin{k})
   end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接