Modelica中的布尔数组的if条件

时间:2011-04-07 21:51:46

标签: modelica

如果这是一个“阅读手册”问题,我很抱歉(我做了但找不到答案)。

我有一系列布尔值,我想测试它们是否属实。

model TestArray

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

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

end TestArray;

我该怎么做? 谢谢, 罗埃尔

4 个答案:

答案 0 :(得分:4)

有些功能类似于您在Modelica.Math.BooleanVectors中请求的功能。

在这里你可以找到allTrue(布尔b [:]),anyTrue(布尔b [:])和oneTrue(布尔b [:])。

答案 1 :(得分: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;

它具有非常有用的语义,但不是100%类似于上面所写的“任何”或“所有”。因此,如果您打算在when子句中使用条件向量,那么请阅读如何处理(在规范中)或询问后续问题,我可以详细说明(它有点超出了这个问题)。

答案 2 :(得分: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;

答案 3 :(得分:0)

您可以使用Modelica.Blocks.Math.BooleanToInteger将布尔数组转换为可以计算的整数数组...