2011-12-21 40 views
3

我正在设计一个函数,它需要作为参数一个结构和任意数量的标志。该函数将包含几个if,用于检查是否设置了特定标志。将标志传递给Matlab函数的最新方法是什么?

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

回答

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

+0

正是我在找的! – Tim 2011-12-21 22:37:52

2

也许你可以通过varargin - 标志的甚至会是名称和奇它们的值(除第一)

函数foo(ST,varargin)

然后通过像这样的值:

美孚(ST,“佛罗里达州G1' ,真正的 '标志2',虚假)
美孚(ST, 'Flag3相同的',真正的 'MyFlag2',虚假, 'MySpecialFlag',虚假)
美孚(ST)

要访问可变参数使用

varargin {2},varargin {3},

等。

要检查一个特定的标志是否通过,d o

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

+0

有没有简单的方法来检查是否通过了特定的标志? – Tim 2011-12-21 22:35:25

+0

@TimN,我更新了我的答案。一探究竟。 – 2011-12-21 22:37:54

2

通行证在标志的struct

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

Foo(st, options); 

要获得被明确地由用户设置的所有标志的列表,使用fieldnames

passedOptions = fieldnames(options); 

这将返回一个单元格数组,其元素是字符串 - 这些字符串是用户设置的标志;该阵列的第i个元素是用户设置的i th标志。

访问所设定的每一旗标值:

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

相关问题