Какой самый удобный способ передачи флагов в функцию Matlab? - PullRequest
3 голосов
/ 22 декабря 2011

Я разрабатываю функцию, которая принимает в качестве аргумента одну структуру и любое количество флагов.Функция будет содержать пару if s, проверяющих, установлен ли определенный флаг.

Каков наилучший способ добиться этого?Я думал о передаче флагов как отдельных строковых аргументов.Есть ли более аккуратное решение?

Ответы [ 5 ]

3 голосов
/ 22 декабря 2011

Я бы сделал это, используя varargin и ismember:

function foo(arg1,arg2,varargin)

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

И вы можете вызвать такую ​​функцию:

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

Это активирует flag1и flag3.

2 голосов
/ 22 декабря 2011

Передача 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} 
2 голосов
/ 22 декабря 2011

Вероятно, вы можете передать varargin - Четными будут имена флагов, а нечетными их значения (кроме первого)

функция Foo (st, varargin)

конец

Затем передайте значения следующим образом:

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

Для доступа к аргументам переменной используйте

Вараргин {2}, Вараргин {3},

и т.д .. * * 1023

Чтобы проверить, был ли передан определенный флаг, выполните

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

1 голос
/ 22 декабря 2011

Вы можете передать флаги в виде строки с 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

Вы должны позаботиться о соответствии длины fvalue и fnames.если они отличаются, вы можете сгенерировать ошибку или как-то исправить ее (убрать лишние флаги или заполнить отсутствующее значение по умолчанию).

0 голосов
/ 22 декабря 2011

varargin - это способ анализа переменного числа произвольных входных аргументов.Если вы хотите больше контролировать синтаксис вызова функции (т. Е. Необязательные / обязательные аргументы), тогда я предлагаю изучить входной синтаксический анализатор Matlab .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...