2014-01-17 5 views
-1

Я запускаю много функций из серии файлов. поэтому логично делать функцию, которая выполняет мои функции на файлах, вместо этого повторяя процедуру в каждом файле. Проблема в том, что количество аргументов для каждой функции различно! Так psudo-код:Matlab: Передача всех аргументов в дескриптор функции

function [out1, out2]=batchDo(@func,adrs,arg1,arg2,...,argn) 

files=ls(adrs); 
for i=1:length(files) 
    raw=load([adrs files(i)]); 
    [out1, out2]=func(raw,arg1,arg2,...,argn) 
    out1s=out1+out1s; 
    out2s=out2+out2s; 
end 
out1=out1s/length(files); 
out2=out2s/length(files); 

К счастью, в моем случае выходы почти одинаковы, и я могу добавить несколько манекенов, чтобы все они похожи. Но если так или иначе будет обращаться к ним, я был бы признателен.

+0

Я не хочу использовать varargin, потому что мои данные большие и обращение к полям делает программы ужасно медленными. – anishtain4

+2

Если вы используете 'arg1' и т. Д. Для' func', можете ли вы просто использовать 'varargin' без адресации ячеек по отдельности, т. Е.' Func (raw, varargin {:}) '? Или создайте анонимную функцию, которая захватывает соответствующие аргументы и передает это вместо, например, 'func2 = @ (raw) func (raw, arg1, arg2, ..., argn)'. Я не уверен, как кто-то должен отвечать на этот вопрос - он граничит с «непонятным, о чем вы спрашиваете». – horchler

+0

Думаю, вам нужно объяснить свою оппозицию варгарину. Он не должен быть медленным и явно является очевидным механизмом в MATLAB для различного количества аргументов. – Peter

ответ

0

Ответ Horchler является правильным, если я просто передаю varargin как varargin {:}, который автоматически обеспечивает то, что мне нужно. Если вы используете varargin в каждой функции, которую вы имеете, а затем пытаетесь обратиться к varargin.arg1 вместо arg1, это замедляет ваш код. Есть множество статей, которые сравнивают выступления.

1

Если входы находятся в определенном порядке (или может быть повторно заказано) таким образом, что, например:

  • все функции принимают аргументы 1 через 3
  • функций, которые принимают дополнительные аргументы, принимать их в порядке : arg4 через Arg8, arg4 через arg10 и т.д.

Тогда вы можете сделать это довольно просто путем добавления varargin к каждой функции, которая не использует полный набор аргументов, но только вместо неиспользованных аргументов (как бы определяя необязательный аргумент ts), а затем игнорирует его в рамках фактической функции. Таким образом, функция может быть:

function myfunction(raw, arg1, arg2, arg3, arg4, arg5, varargin) 

Если на самом деле это используется только arg1 ... arg5, а остальные игнорируются.