Modelica中布尔数组的if条件

Modelica中布尔数组的if条件,modelica,Modelica,如果这是一个“阅读手册”问题,我很抱歉(我问了,但找不到答案) 我有一系列布尔值,我想测试其中是否有一个是真的 model TestArray (...) Boolean[:] booleanArray; Real y; equation y = if [if any element in booleanArray is true] then ... else ...; end TestArray; 我该怎么做? 谢谢 Roel现在我找到了一个解决办法,但一定可以做得更好: model

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

我有一系列布尔值,我想测试其中是否有一个是真的

model TestArray

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

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

end TestArray;
我该怎么做? 谢谢
Roel

现在我找到了一个解决办法,但一定可以做得更好:

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;

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

这是一个有趣的问题。坦白地说,我不知道有任何内置的功能可以做到这一点(尽管对这些功能的需求肯定是有效的)

我们过去经常做的是编写名为“any”和“all”的实用函数,它们看起来是这样的(未经测试,但您明白了):

这与您所做的类似,但使用数组理解,然后将其封装到函数中。这允许您编写如下代码:

if any(conditions) then ... else ...;
理想情况下,可以将这些函数添加到内置的“reduction操作符”(如min和max)集中,但语言组在引入此类操作符时往往有些保守,因为它们会污染名称空间并与现有代码产生潜在冲突

注意,当使用when子句时,事情变得有点棘手。when子句有一个向量结构,例如

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

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

有一些函数与您在Modelica.Math.BooleanVectors中请求的函数类似


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

谢谢Michael,这看起来是个不错的解决方案!目前,我没有在when子句中使用这个向量,所以当我需要它并且不理解规范时,我会给你回复。不幸的是,Modelica.Blocks.Math.BooleanToInteger不是一个函数,而是一个必须实例化才能使用它的对象。我担心这会使这个解决方案不那么有用。太好了,我想这正是我需要的!
when {cond1, cond2, cond3} then
  ...
end when;