は、アレイの列ベクトルなどのパラメータのすべての可能なセットを生成する再帰関数は次のとおり
function idx=dynloop(varargin)
if nargin==1
idx=varargin{1};
else
idx=dynloop(varargin{2:end});
idx=[repelem(varargin{1},size(idx,2));
repmat(idx,[1,length(varargin{1})])];
end
return
出力例:次いで5:7
上ループ、8
、[2,3,5,7]
:
>> idx = dynloop(5:7,8,[2,3,5,7])
idx =
5 5 5 5 6 6 6 6 7 7 7 7
8 8 8 8 8 8 8 8 8 8 8 8
2 3 5 7 2 3 5 7 2 3 5 7
出力はndgrid
のものと同等です(私の意見では直感的な形を除いて)。 (また、いくつかの予備的なベンチマークが、これはわずかに速いndgrid
よりかもしれあった...決定されて?!)
メインループ:は今だけidx
の列を反復処理する一つのループを使用します。このソリューションのコンセプトは、@ダニエル氏がOPでコメントしたように、this solutionに似ています。
Weight = 45000:5000:75000;
Altitude = 10000;
Speed = 0.2:0.1:0.9;
idx = dynloop(Weight,Altitude,Speed);
for ii=1:size(idx,2)
params = idx(:,ii);
%// do stuff with params!
%// ...
end
EDIT:文字列と数値入力の両方を処理するための
私は掲載元再帰関数の簡単なMODではなく、実際の要素よりも、それはインデックスを返すことができますので、文字列のセルは大丈夫です:
function idx=dynloop(varargin)
if nargin==1
idx=1:length(varargin{1});
else
idx=dynloop(varargin{2:end});
idx=[repelem(1:length(varargin{1}),size(idx,2));
repmat(idx,[1,length(varargin{1})]);];
end
return
だから、完全に、あなたの関数は、おそらく次のように動作する:
function yourMainFcn(varargin)
idx=dynloop(varargin{:});
for ii=1:size(idx,2)
params = cellfun(@(x,k) numORcell(x,k),...
varargin,num2cell(idx(:,ii).'),... %//'
'UniformOutput',0);
%// do stuff with params!
%// ...
disp(params)
end
end
0123機能numORcell
適宜セルデータに対して数値解析し :文字列と
function y=numORcell(x,k)
if iscell(x)
y=x{k};
else
y=x(k);
end
end
例:
Weight = 45000:5000:75000;
Altitude = 10000;
Speed = 0.2:0.1:0.9;
Names = {'Foo','Bar'};
>> yourMainFcn(Names,Altitude,Weight)
'Foo' [10000] [45000]
'Foo' [10000] [50000]
'Foo' [10000] [55000]
'Foo' [10000] [60000]
'Foo' [10000] [65000]
'Foo' [10000] [70000]
'Foo' [10000] [75000]
'Bar' [10000] [45000]
'Bar' [10000] [50000]
'Bar' [10000] [55000]
'Bar' [10000] [60000]
'Bar' [10000] [65000]
'Bar' [10000] [70000]
'Bar' [10000] [75000]
又は代わり:
>> yourMainFcn(Names,Names,Speed,Names)
'Foo' 'Foo' [0.2] 'Foo'
'Foo' 'Foo' [0.2] 'Bar'
'Foo' 'Foo' [0.3] 'Foo'
'Foo' 'Foo' [0.3] 'Bar'
'Foo' 'Foo' [0.4] 'Foo'
...
'Foo' 'Foo' [0.9] 'Bar'
'Foo' 'Bar' [0.2] 'Foo'
...
'Foo' 'Bar' [0.9] 'Bar'
'Bar' 'Foo' [0.2] 'Foo'
...
'Bar' 'Foo' [0.9] 'Bar'
...
'Bar' 'Bar' [0.8] 'Foo'
'Bar' 'Bar' [0.8] 'Bar'
'Bar' 'Bar' [0.9] 'Foo'
'Bar' 'Bar' [0.9] 'Bar'
運動が読者に左:idx
にすべてのインデックスを格納するのがメモリの問題である場合、かなり重いループを実行しているに違いありません。それにもかかわらず、現在のインデックスセットから次の辞書式インデックスセットを決定する関数を作成することができます。つまり、インデックスの1つのセットを格納し、各ループの最後に反復するだけです。
あなたは[これと同じような](http://stackoverflow.com/a/34840222/2732801)をお探しですか? – Daniel
私は入力ファイルを解析し、その結果を関数の引数として渡します。 – excaza
構文解析を行う必要はありません。ループの最大数(たとえば、ループオーバーウェイト、高度、速度、温度、フラップなど)を使用するコードを記述するだけです。パラメータの1つが定数である場合、ループは効果的に行われず、インデックスを一度設定して次のループに移動します。 –