2011-04-07 3 views
2

Je suis désolé si c'est une question de 'lire le manuel' (j'ai fait mais je ne trouve pas de réponse).if-condition sur un tableau de booléens dans Modelica

J'ai un tableau de booléens et je veux tester si l'un d'eux est vrai.

model TestArray 

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

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

end TestArray; 

Comment est-ce que je peux faire ceci? Merci, Roel

Répondre

3

Il existe des fonctions comme celles que vous demandez dans Modelica.Math.BooleanVectors.

Ici, vous trouverez tous True (Boolean b [:]), anyTrue (Boolean b [:]) et oneTrue (Boolean b [:]).

+0

Merveilleux, je suppose que c'est exactement ce dont j'ai besoin! – saroele

0

Maintenant, je trouve une solution de contournement, mais il doit être possible de le faire beaucoup plus agréable:

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; 
0

Vous pouvez utiliser Modelica.Blocks.Math.BooleanToInteger pour convertir votre booléenne-tableau à un tableau d'entiers avec lequel vous pouvez calculer ...

+0

Malheureusement, Modelica.Blocks.Math.BooleanToInteger n'est pas une fonction, mais un objet qui doit être instancié pour pouvoir l'utiliser. Cela rend cette solution moins utile, je le crains. – saroele

3

Ceci est une question intéressante. Franchement, je ne suis pas au courant des capacités intégrées pour ce faire (bien que le besoin de telles capacités soit certainement valide).

Ce que nous avons souvent fait dans le passé est d'écrire des fonctions utilitaires appelées « tout » et « tous », qui ressemblent à ceci (non testé, mais vous voyez l'idée):

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; 

C'est similaire à ce que vous avez fait, mais en utilisant des compréhensions de tableau, puis en encapsulant cela dans les fonctions. Cela vous permet d'écrire du code comme:

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

Idéalement, ces fonctions pourraient être ajoutées à l'ensemble des « opérateurs de réduction » (comme min et max) intégrée, mais le groupe linguistique a tendance à être un peu conservateur au sujet introduire de tels opérateurs parce qu'ils polluent l'espace de noms et créent des collisions potentielles avec le code existant.

Notez que les choses deviennent un peu compliquées lors de l'utilisation des clauses when. Avec les clauses when, il y a une construction vectorielle, par ex.

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

qui a très sémantique utile, mais pas à 100% analogue soit « tout » ou « tout » comme écrit ci-dessus. Donc, si vous avez l'intention d'utiliser un vecteur de conditions dans une clause when, lisez la façon dont cela est traité (dans la spécification) ou posez une question de suivi à ce sujet et je pourrais en dire plus. cette question).

+0

Merci Michael, ça ressemble à une bonne solution! Pour l'instant, je n'utilise pas ce vecteur dans une clause when, donc le jour où j'en aurai besoin et que je ne comprendrai pas les spécifications, je reviendrai vers vous. – saroele

Questions connexes