将标志传递给Matlab函数的最佳方法是什么?

时间:2011-12-21 21:49:31

标签: matlab argument-passing

我正在设计一个函数,它将一个结构和任意数量的标志作为参数。该函数将包含几个if s,检查是否设置了特定标志。

实现这一目标的最佳方法是什么?我正在考虑将标志作为单独的字符串参数传递。有更整洁的解决方案吗?

5 个答案:

答案 0 :(得分:3)

我会这样做,比如使用vararginismember

function foo(arg1,arg2,varargin)

  flag1=ismember('flag1',varargin);
  flag2=ismember('flag2',varargin);
  flag3=ismember('flag3',varargin);

你可以这样调用这个函数:

foo(a1,a2,'flag3','flag1')

这会激活flag1flag3

答案 1 :(得分:2)

可能你可以通过varargin - 偶数将是标志的名称和奇数的值(第一个除外)

  

function Foo(st,varargin)

     

然后传递这样的值:

  

Foo(st,'Flag1',true,'Flag2',false)
  Foo(st,'Flag3',true,'MyFlag2',false,'MySpecialFlag',false)
  FOO(ST)

要访问变量参数,请使用

  

varargin {2},varargin {3},

等。

要检查是否已传递特定标志,请执行

  

flagNames = varargin {2:en​​d};
  ismember('MyFlag',flagNames)

答案 2 :(得分:2)

传递struct个标志:

options = struct(...
    'Flag1', true, ...
    'Flag2', true, ...
    'MySpecifFlag', false ...
);

Foo(st, options);

要获取用户明确设置的所有标志的列表,请使用fieldnames

passedOptions = fieldnames(options);

这将返回一个单元格为字符串的单元格数组 - 这些字符串是用户设置的标志;数组的i元素是用户设置的i标志。

访问已设置的每个标志的值:

options.(passedOptions{i}) %# gets the value of the flag corresponding to passedOptions{i} 

答案 3 :(得分:1)

您可以将标志作为字符串传递0和1。订单可以修复,也可以传递一个标志名称的单元格数组。

flagstr = '101'; %# string passed as argument
flaglog = flagstr=='1'; %# logical vector, can be accessed as flaglog(i)
fname = {'flag1','flag2','flag3'}; %# flag names, can be passed as argument or defined in the function
fvalue = num2cell(flaglog); %# create cell array
flags = cell2struct(fvalue, fname, 2); %# create a structure, so you can access a flag with flags.flag1

您需要注意匹配fvaluefnames的长度。如果它们不同,您可以生成错误或以某种方式更正它(删除额外的标志或填充默认值的缺席)。

答案 4 :(得分:0)

varargin是解析可变数量的任意输入参数的方法。如果你想要更多地控制函数的调用语法(即可选/必需参数),那么我建议查看Matlab的input parser