提供变量参数列表

时间:2011-07-26 21:29:44

标签: matlab arguments matlab-struct

我有一个接受可变数量输入变量的函数。问题是,我要提供的输入参数的数量会有所不同。因此,我将所有参数存储在结构中:

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 个答案:

答案 0 :(得分:4)

使用structure array存储数据的替代方法是使用cell array。例如:

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{:}将单元格数组的内容转储到所谓的comma-separated list中。这相当于键入avgs{1}, avgs{2}, ... , avgs{end}。来自the answer you found的语法foo(:).bar也会创建一个以逗号分隔的列表,但我发现为此目的使用单元格数组通常比使用结构数组更清晰。

答案 1 :(得分:3)

是的,您可以使用可变长度输入参数列表 varargin

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

答案 2 :(得分:2)

所以,玩完之后,我就明白了。使用上面的例子:

如果1xN struct名为foo,其中每个foo(n)包含字段bar,我会将该函数称为:

function(foo(:).bar);

这与输入

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

通过这种方式,我可以动态扩展或缩小foo,并且在调用函数时仍然没有问题。

答案 3 :(得分:0)

你可以通过MATLAB中的varargin构造确实做到这一点。这将是:

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}您可以处理它。