3

これが「マニュアルを読む」質問である場合は申し訳ありません(私はそうしましたが、答えが見つかりません)。

ブール値の配列があり、それらのいずれかが真であるかどうかをテストしたいと思います。

model TestArray

(...)
Boolean[:] booleanArray;
Real y;

equation
y = if [if any element in booleanArray is true] then ... else ...;

end TestArray;

これどうやってするの?ありがとう、ロエル

4

4 に答える 4

5

Modelica.Math.BooleanVectorsで要求しているような関数があります。

ここには、allTrue(Boolean b [:])、anyTrue(Boolean b [:])、およびoneTrue(Boolean b [:])があります。

于 2011-05-05T11:19:01.357 に答える
3

これは興味深い質問です。率直に言って、私はこれを行うための組み込み機能を知りません(そのような機能の必要性は確かに有効ですが)。

過去に頻繁に行ったことは、「any」および「all」と呼ばれる、次のようなユーティリティ関数を作成することです(テストされていませんが、アイデアは得られます)。

function any
  input Boolean vals[:];
  output Boolean result;
algorithm
  result := max({if i==true then 1 else 0 for i in vals})==1;
end any;

function all
  input Boolean vals[:];
  output Boolean result;
algorithm
  result := min({if i==true then 1 else 0 for i in vals})==1;
end all;

これはあなたがしたことと似ていますが、配列内包表記を使用し、それを関数にカプセル化します。これにより、次のようなコードを記述できます。

if any(conditions) then ... else ...;

理想的には、これらの関数を組み込みの「削減演算子」のセット(minやmaxなど)に追加できますが、言語グループは、名前空間を汚染し、既存のコードとの潜在的な衝突を引き起こすため、このような演算子の導入についてはやや保守的な傾向があります。

when句を使用すると、少し注意が必要になることに注意してください。when句を使用すると、ベクトル構造があります。

when {cond1, cond2, cond3} then
  ...
end when;

これは非常に便利なセマンティクスを持っていますが、上記の「any」または「all」のいずれにも100%類似しているわけではありません。したがって、when句で条件のベクトルを使用する場合は、これが(仕様で)どのように処理されるかを確認するか、フォローアップの質問をしてください。詳細を説明できます(範囲をやや超えています)。この質問)。

于 2011-04-08T14:51:14.730 に答える
0

今、私は回避策を見つけましたが、それをはるかにうまく行うことが可能でなければなりません:

model TestArray

(...)
Boolean[:] booleanArray;
Real y;
Real[:] test;

equation
for i in 1:size(booleanArray):
  test[i] = if booleanArray[i] then 1 else 0;
end for;

y = if sum(test) > 0 then ... else ...;

end TestArray;
于 2011-04-07T22:18:02.547 に答える
0

Modelica.Blocks.Math.BooleanToIntegerを使用して、ブール配列を計算可能な整数配列に変換できます...

于 2011-04-08T07:52:08.917 に答える