如果这是一个“阅读手册”问题,我很抱歉(我做了但找不到答案)。
我有一系列布尔值,我想测试它们是否属实。
model TestArray
(...)
Boolean[:] booleanArray;
Real y;
equation
y = if [if any element in booleanArray is true] then ... else ...;
end TestArray;
我该怎么做? 谢谢, 罗埃尔
答案 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将布尔数组转换为可以计算的整数数组...