如果这是一个“阅读手册”问题,我很抱歉(我做了但找不到答案)。
我有一组布尔值,我想测试它们中的任何一个是否为真。
model TestArray
(...)
Boolean[:] booleanArray;
Real y;
equation
y = if [if any element in booleanArray is true] then ... else ...;
end TestArray;
我怎样才能做到这一点?谢谢,罗尔
如果这是一个“阅读手册”问题,我很抱歉(我做了但找不到答案)。
我有一组布尔值,我想测试它们中的任何一个是否为真。
model TestArray
(...)
Boolean[:] booleanArray;
Real y;
equation
y = if [if any element in booleanArray is true] then ... else ...;
end TestArray;
我怎样才能做到这一点?谢谢,罗尔
在 Modelica.Math.BooleanVectors 中有您要求的功能。
在这里您会找到 allTrue(Boolean b[:])、anyTrue(Boolean b[:]) 和 oneTrue(Boolean b[:])。
这是个有趣的问题。坦率地说,我不知道这样做的任何内置功能(尽管对此类功能的需求肯定是有效的)。
我们过去经常做的是编写名为“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 子句中使用条件向量,请阅读如何处理(在规范中)或询问后续问题,我可以详细说明(这有点超出了这个问题)。
现在我找到了一种解决方法,但必须可以做得更好:
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 将您的布尔数组转换为整数数组,您可以使用它计算...