2

概要: 複数の構造体を返す関数を呼び出したいn。反復ごとにスカラーを含む新しいフィールドを作成する代わりに、結果を出力構造体の既存のフィールドに追加する (つまり、ベクトルを作成する) にはどうすればよいですか?


: sample_fct( x )1) いくつかの操作を実行しx、その結果をいくつかの新しい変数 (aおよびbサンプル コード) に保存し、2) いくつかのサブ関数を呼び出して入力としてcalculate_one( x )and calculate_two( x )を使用する関数を考えます。これらの関数が正確に何をするかは問題ではありません。これらの関数の出力は、 structおよびに収集されます。abAB

function [A, B] = sample_fct( x )
    a = 1 * x;
    b = 2 * x;
    [A.one, A.two] = call_functions( a );
    [B.one, B.two] = call_functions( b );
    function [one, two] = call_functions( input )
        one = calculate_one( input );
        two = calculate_two( input );
        function one = calculate_one( input )
            one = input.^2;
        end
        function two = calculate_two( input )
            two = input.^3;
        end
    end
end

n次に、スクリプトでさまざまな入力パラメーターを使用してこの関数を何度も呼び出したい

n = 3;
for i = 1:n
    [A(i), B(i)] = sample_fct( i );
end

これをA行っBて 1*n 構造体になると、各フィールドには再びフィールドonetwo. したがって、私の例でn = 3は、スカラーoneとの 3 つのインスタンスがありtwoます。サンプル コードの出力は次のようになります。

>> A
A = 
1x3 struct array with fields:
    one
    two
>> A.one
ans =
     1
ans =
     4
ans =
     9

私が実際に望んでいるのはA、 andBが 1*n ベクトルoneとを持つ 1*2 構造体でtwoあるため、目的の出力は次のようになります。

>> A
A = 
    two: [1 8 27]
    one: [1 4 9]

[one, two] を関数の出力変数にせずに、また A と B の関数を別々に呼び出さずに、どうすれば正確にこれを行うことができますか?


これを行う理由: 時系列でさまざまなパラメーターの組み合わせを使用して予測モデルを実行し、1 分、1 時間、1 日などの表現について、いくつかの適合度やその他の統計を計算したいと考えています。私の例でxは、時系列、n異なるパラメーター ベクトルのループ オーバー ループ、異なるサンプリング時間の表現、aおよび構造体と. これを行うためのはるかに洗練された方法があると確信していますが、頭を包むことはできません。btwoAB

構造体の代わりにベクトル/行列を使用すると簡単に実行できることはわかっていますが、多くの計算を行うため、A.hourly(:,19) などの代わりに変数名を使用して出力を呼び出せるようにしたいと考えています。私の実際のコードでは2つだけではありません。

4

2 に答える 2