3 Stimmen

if-Bedingung für ein Array von Booleschen Werten in Modelica

Es tut mir leid, wenn dies eine Frage nach dem Motto "Lesen Sie das Handbuch" ist (das habe ich getan, kann aber keine Antwort finden).

Ich habe ein Array von Booleans und ich möchte testen, ob einer von ihnen wahr ist.

model TestArray

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

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

end TestArray;

Wie kann ich das tun? Danke! Roel

5voto

Peter Sundström Punkte 66

Es gibt Funktionen wie die von Ihnen angefragten in Modelica.Math.BooleanVectors.

Hier finden Sie allTrue(Boolean b[:]), anyTrue(Boolean b[:]) und oneTrue(Boolean b[:]).

3voto

Michael Tiller Punkte 9141

Dies ist eine interessante Frage. Ehrlich gesagt sind mir keine eingebauten Funktionen bekannt, die dies ermöglichen (obwohl der Bedarf an solchen Funktionen sicherlich gegeben ist).

In der Vergangenheit haben wir häufig Hilfsfunktionen mit den Namen "any" und "all" geschrieben, die wie folgt aussehen (ungetestet, aber Sie verstehen die Idee):

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;

Dies ähnelt dem, was Sie getan haben, aber mit Array Comprehensions und dann kapseln, dass in Funktionen. Dies ermöglicht es Ihnen, Code zu schreiben wie:

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

Idealerweise könnten diese Funktionen dem eingebauten Satz von "Reduktionsoperatoren" (wie min und max) hinzugefügt werden, aber die Sprachgruppe neigt dazu, bei der Einführung solcher Operatoren etwas konservativ zu sein, da sie den Namensraum verschmutzen und potenzielle Kollisionen mit bestehendem Code verursachen.

Beachten Sie, dass es bei der Verwendung von when-Klauseln etwas komplizierter wird. Bei when-Klauseln gibt es eine Vektorkonstruktion, z. B.

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

Das hat eine sehr nützliche Semantik, ist aber nicht 100%ig analog zu "any" oder "all", wie oben geschrieben. Wenn Sie also beabsichtigen, einen Vektor von Bedingungen in einer when-Klausel zu verwenden, dann lesen Sie nach, wie dies (in der Spezifikation) gehandhabt wird, oder stellen Sie eine Folgefrage dazu, und ich kann mehr dazu sagen (das würde den Rahmen dieser Frage etwas sprengen).

2voto

Tobias Punkte 4866

Abschnitt 10.3.4 der Modelica-Spezifikation Version 4.3 erlaubt boolesche Arrays v als Argumente von min(v) et max(v) .

Wenn alle Komponenten von v sind true dann min(v) gibt true , false sonst.
Wenn alle Komponenten von v sind false dann max(v) gibt false , true sonst.

Beispielmodell:

model Test
    Boolean anyFalseGivesFalse = min( { true, false } );
    Boolean allTrueGivesTrue = min( { true, true } );
    Boolean allFalseGivesFalse = max( { false, false } );
    Boolean anyTrueGivesTrue = max( { false, true } );
end Test;

0voto

saroele Punkte 8631

Jetzt habe ich eine Abhilfe gefunden, aber es muss doch möglich sein, es viel schöner zu machen:

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;

0voto

ruben baetens Punkte 2706

Sie könnten Modelica.Blocks.Math.BooleanToInteger verwenden, um Ihr Boolesches Array in ein Integer-Array zu konvertieren, mit dem Sie dann ...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X