我有一个接受可变数量输入变量的函数。问题是,我要提供的输入参数的数量会有所不同。因此,我将所有参数存储在结构中:
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>
以程序化的方式。谢谢!
答案 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
答案 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}
您可以处理它。