在Matlab函数中传递标志的最简洁方式是什么?

3
我正在设计一个函数,它以一个结构体和任意数量的标志作为参数。该函数将包含几个if语句,检查是否设置了特定的标志。
如何最简洁地实现这一点?我考虑将标志作为单独的字符串参数传递。有没有更简洁的解决方案?
5个回答

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

2

您可以使用 varargin 参数 - 偶数位置的参数是标志名称,奇数位置的参数是标志的值(除了第一个)。

function Foo(st, varargin)

end

然后像这样传递值:

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

要访问可变参数,请使用

varargin{2}, varargin{3},

等等。

要检查是否传递了特定的标志,请执行以下操作

flagNames = varargin{2:end};
ismember('MyFlag',flagNames )


有没有一种简单的方法来检查特定标志是否被传递了? - Tim

2
传入一个包含标志的结构体:
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} 

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的长度。如果它们不同,你可以生成一个错误或者以某种方式进行纠正(删除额外的标志或填充默认值)。


0

varargin 是解析任意数量的输入参数的最佳方式。如果您想对函数的调用语法(即可选/必需参数)有更多控制,则建议查看Matlab的input parser


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