1

可変数の入力変数を受け入れる関数があります。問題は、提供する入力引数の数がさまざまであることです。そのため、すべての引数を構造体に格納します。

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 に答える 4

4

構造体配列を使用してデータを格納する代わりに、セル配列を使用することもできます。例えば:

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でもコンマ区切りのリストが作成されますが、そのような目的でセル配列を使用する方が、構造配列を使用するよりも一般的にクリーンであることがわかります。

于 2011-07-27T14:05:01.427 に答える
3

はい、可変長の入力引数リスト varargin を使用できます

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

于 2011-07-26T21:35:43.000 に答える
2

それで、遊んだ後、私はそれを手に入れました。上記の例を使用すると、次のようになります。

それぞれがフィールドを含む1xN struct名前付きの場合、関数を次のように呼び出します。foofoo(n)bar

function(foo(:).bar);

これはタイピングと同じです

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

このようにして、動的に拡大または縮小できますfooが、関数の呼び出しに問題はありません。

于 2011-07-27T13:28:07.747 に答える
0

vararginMATLABのコンストラクトを使用して、そのようなことを確実に行うことができます。これは次のようになります。

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}ます。これは処理できます。

于 2011-07-26T22:32:16.867 に答える