условие if для массива логических значений в Modelica - PullRequest
2 голосов
/ 08 апреля 2011

Извините, если это вопрос «прочитайте руководство» (я ответил, но не могу найти ответ).

У меня есть массив логических значений, и я хочу проверить, есть ли какие-либо из нихэто правда.

model TestArray

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

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

end TestArray;

Как я могу это сделать?Спасибо, Рол

Ответы [ 4 ]

4 голосов
/ 05 мая 2011

Есть функции, подобные тем, которые вы запрашиваете в Modelica.Math.BooleanVectors.

Здесь вы найдете allTrue (Boolean b [:]), anyTrue (Boolean b [:]) и oneTrue (Boolean b [:]).

3 голосов
/ 08 апреля 2011

Это интересный вопрос.Честно говоря, я не знаю каких-либо встроенных возможностей для этого (хотя необходимость в таких возможностях, безусловно, действительна).

В прошлом мы часто делали для написания служебных функций, называемых "любые "и" все ", которые выглядят так (непроверено, но вы поняли идею):

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% аналогична «any» или «all», как написано выше.Поэтому, если вы намереваетесь использовать вектор условий в предложении when, прочитайте о том, как это обрабатывается (в спецификации), или задайте дополнительный вопрос по этому вопросу, и я могу уточнить подробнее (это несколько выходит за рамкиэтот вопрос).

0 голосов
/ 08 апреля 2011

Вы можете использовать Modelica.Blocks.Math.BooleanToInteger, чтобы преобразовать ваш логический массив в массив Integer, с помощью которого вы можете вычислять ...

0 голосов
/ 08 апреля 2011

Теперь я нашел обходной путь, но должно быть возможно сделать это намного лучше:

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;
...