2

O1 O2 O3それぞれIFステートメントを使用する3つのループ操作があり、flag=[F1 F2 F3]値が最大の操作の実行優先度が高くなっています。

その値に応じて操作を切り替えるにはどうすればよいflagですか?各操作のフラグ値は時間とともに変化します。

簡単にするために、操作1が最初に実行され、ループの終わりまでにフラグ値が最小になるため、操作2または3を次に実行する必要があります。したがって、この例では、t=0 : F1=5 F2=3 and F3=1.

私が達成しようとしていることのための過度に単純化された擬似コード:

while 1
  find largest flag value using [v index]=max(flag)
  Run operation with highest flag value
   ..loop back..
end

オペレーション間でフラグの値がどのように比較されるかはわかりません。したがって、誰かがここでこの問題に光を当てることを望んでいるのはなぜですか。

編集

現在、すべての操作は1つのmatlabファイルに書き込まれ、それぞれがIFステートメントでトリガーされます。操作は次々に体系的に実行されます(どちらが最初にmatlabに書き込まれるかによって異なります)。flagそれを避けて、代わりに値に応じてトリガーしたいと思います。

4

1 に答える 1

3

操作が関数である場合(質問からは少しわかりにくい)、関数ハンドルのセル配列を作成しfun1ます。実際の関数の1つの名前があります。

handles = {@fun1, @fun2, @fun3}

次に、用語から返されたインデックスを使用してmax、配列から正しい関数を取得できます。次の構文を使用して、任意の引数を関数に渡すことができます。

handles{index}(args)

上記のスタイルを使用すると、ソリューションがスケーラブルになるためif、操作の数が増えたときにメンテナンスが必要なステートメントのスタックは必要ありません。関数が本当に単純な場合は、いつでもラムダ(またはMatlabの無名関数が話す)を使用できます。

ただし、拡張される可能性が低い単純な操作の数が限られている場合は、代わりにwhileループでswitchステートメントを使用することを選択できます。ifそれは、ステートメントのスタックよりもあなたの意図をよりよく伝えます。

while 1
  [~, index]=max(flag);
  switch index
      case 1
          operation1
          flag = [x y z]
      case 2
          operation2
          flag = [x y z]
      otherwise
          operation3
          flag = [x y z]
    end
end
于 2013-02-15T00:49:25.260 に答える