1

シミュレーションを行う別の関数に要素ごとに入力したい数値の配列(randparam)を計算する関数があります。

例えば

function [randparam] = arraycode

code 

randparam = results of code 
% randparam is now a 1x1001 vector. 

end

次に、シミュレーション関数にrandparamを1つずつ入力します

function simulation 

x = constant + constant * randparam + constant

return 
end

私にとってこれを難しくしているのは、シミュレーション関数のreturnコマンドのためです。これは、上記の式xの1つのステップのみを計算し、結果を別の関数に返し、それを積分器と呼びます。その後、積分器関数はシミュレーション関数を再度呼び出します。 xを計算します。

したがって、積分器関数は次のようになります。

function integrator (x)
y = simulation(x) * 5
u = y+10
yy = simulation(x) * 10 + u

end

ご覧のとおり、積分器関数はシミュレーション関数を2回呼び出します。これは私にとって2つの問題を引き起こします:

  1. シミュレーション関数でforループを作成し、次のようなものを使用して要素ごとに入力するとします。

    i = 1:100の場合

    x=定数+定数*randparam(i)+定数

    リターン
    エンド

その後、積分器関数がシミュレーション関数を再度呼び出すたびに、forループが最初から1から始まります。

2.シミュレーション関数のforループが1からステップアップすることを認識できるように、ベースワークスペースにiを保持した場合、2番目の関数と呼ばれるとすぐにy関数とyy関数のx入力が異なります。 yyの時間の場合、yによる呼び出しのおかげで、iはi+1になります。

このシナリオでforループを回避する方法はありますか?問題2の解決策の1つは、スクリプトを複製して名前を変え、forループに別の変数を使用させることですが、これはかなり非効率的です。

私がこれを明確にしたことを願っています。

ありがとう。

4

2 に答える 2

3

まず、一般的に同じ関数を配列の各要素に適用したいが、それを行うための組み込みのベクトル化された方法がまだない場合は、次を使用できますarrayfun(ただし、多くの場合、単純なforループの方が高速で読みやすくなります)。

%# randparam is a 1x1001 vector. 
%#next I want to input randparam 1 by 1 into my simulation function
function simulation 
    x = constant + constant * randparam + constant
    return 
end

(注:この関数は値を返さず、MATLABは参照を渡さないため、この関数が何を実行できるかを自問してください。)これはarrayfun次の目的です。配列(またはベクトル、この場合)。繰り返しになりますが、明示的なループではなく、これを行うことが理にかなっていることを確認する必要があります。

function simulation(input_val)
#% your stuff
end


sim_results = arrayfun( @simulation, randparam);

もちろん、あなたがそれを書いた方法、行

x = constant + constant*randparam + constant;

ベクトル化することができます(そしてそうするでしょう)-ベクトルまたは行列を与えると、ベクトルまたは行列が結果になります。

次に、MATLABの関数変数の「範囲」が明確ではないようです。関数を呼び出すと、クリーンなワークスペースが作成されます。したがってx、ある関数から呼び出した別の関数内で自動的に使用できるわけではありません。変数も関数の最後でスコープ外になるため、関数内で使用しても、その関数の外部に存在するx変数が変更/上書きされることはありません。xまた、関数の複数の呼び出しには、それぞれ独自のワークスペースがあります

于 2012-06-13T00:32:36.130 に答える
0

インテグレータ レベルでのループの何が問題になっていますか?

function integrator (x)

for i=1:length(x)
    y = simulation(x(i)) * 5
    u = y+10
    yy = simulation(x(i)) * 10 + u
end

そして、randparm 全体をインテグレーターに渡しますか? simulation同じ入力が与えられたときに同じ値を返したいのか、同じ入力で2回ステップしたいのか、呼び出しごとに新しい入力が必要なのか、あなたの質問からは明らかではありません。simulation内部状態を保持しているかどうかも明らかではありません。例を書いた方法では、シミュレーションは入力値のみに依存し、以前の入力や出力には依存しないため、ベクトル化するのは簡単です。私たち全員がボートを逃している場合は、より洗練されたサンプルコードで質問を編集してください.

于 2012-06-13T13:17:27.077 に答える