Предоставить список переменных аргументов - PullRequest
1 голос
/ 27 июля 2011

У меня есть функция, которая принимает переменное количество входных переменных. Проблема в том, что количество входных аргументов, которые я собираюсь предоставить, варьируется. Таким образом, я храню все аргументы в структуре:

function grandAvg(datafiles)

% Load up all averaged datafiles
avgs = struct();
for n=1:length(datafiles)
    avgs(n).avg = load(datafiles{n});
end

У меня вопрос: есть ли способ расширить этот аргумент для функции? Мне нужен способ преобразовать это:

% DOES NOT WORK
avg = ft_timelockgrandaverage(cfg, avgs);

к этому:

% WOULD WORK, BUT DO NOT WANT TO TYPE IT OUT
avg = ft_timelockgrandaverage(cfg, avgs(1).avg, ..., avgs(n).avg); 

РЕДАКТИРОВАТЬ ДОБАВИТЬ: Так что, очевидно, мой вопрос не был ясен. Я знаю, как построить функцию, используя varargin. Мой вопрос был таков: если я пытаюсь использовать встроенную функцию, которую я не хочу или не могу изменить, как я могу предоставить аргументы переменным образом? Т.е. я заранее не знаю, сколько аргументов я предоставлю, поэтому, когда я вызываю функцию, мне придется вызывать ее с числом аргументов X. По сути, я ищу способ повернуть это:

someVar  <1xN struct>

в это:

someVar1  <1x1 struct>
someVar2  <1x1 struct>
...
someVarN  <1x1 struct>

программным способом. Спасибо!

Ответы [ 4 ]

4 голосов
/ 27 июля 2011

Альтернативой использованию структурного массива для хранения ваших данных будет использование массива ячеек . Например:

nFiles = numel(datafiles);  %# Number of files
avgs = cell(1,nFiles);      %# Initialize an empty cell array
for iFile = 1:nFiles        %# Loop over the files
  avgs{iFile} = load(datafiles{iFile});  %# Load the data into each cell
end
avg = ft_timelockgrandaverage(cfg, avgs{:});  %# Pass the contents to a function

Синтаксис avgs{:} сбрасывает содержимое массива ячеек в так называемый список через запятую . Это эквивалентно вводу avgs{1}, avgs{2}, ... , avgs{end}. Синтаксис foo(:).bar из найденного вами ответа также создает разделенный запятыми список, но я считаю, что использование массивов ячеек для таких целей обычно чище, чем использование структурного массива.

3 голосов
/ 27 июля 2011

да, вы можете использовать список входных аргументов переменной длины varargin

http://www.mathworks.com/help/techdoc/ref/varargin.html

2 голосов
/ 27 июля 2011

Итак, поиграв, я понял. Используя пример сверху:

Учитывая 1xN struct с именем foo, где каждый foo(n) содержит поле bar, я бы назвал функцию как:

function(foo(:).bar);

Это то же самое, что и

function(foo(1).bar, foo(2).bar, ..., foo(N).bar);

Таким образом, я могу динамически расширять или уменьшать foo и все еще не испытываю проблем с вызовом функции.

0 голосов
/ 27 июля 2011

Вы, безусловно, можете сделать это с помощью конструкции varargin в MATLAB. Это будет что-то вроде:

avg = ft_timelockgrandaverage(cfg, avgs.avg); 

А для функции ft_timelockgrandaverage

function output = ft_timelockgrandaverage(config, varargin)
% your code here

varargin будет массивом ячеек: {avgs(1).avg, avgs(2).avg, ..., avgs(3).avg}, который вы можете обработать.

...