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;

它具有非常有用的语义,但不是 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 回答