【问题标题】:Assign value to array elements, given some condition给定某些条件,为数组元素赋值
【发布时间】:2021-03-15 15:35:05
【问题描述】:

假设我有向量

Real x[5]={1,2,3,4,5};

Real y[5]={0,0,0,0,0};

我想给y的元素赋值给x的某些条件,例如,对于x中大于或等于3的每个元素,对应的y应该设置为1,对于每个x<3: y=sin(x)

在matlab中,我会这样写:

  y(x>=3)=1;
  y(x<3)=sin(x(x<3));

所以

x=[1 2 3 4 5]

结果

y=[sin(1) sin(2) 1 1 1]

在 Modelica 中可以做类似的事情吗?如果可以,如何做?

【问题讨论】:

  • 我认为这样的事情会起作用:y = if (x[i] >= 3) then 1 else sin(x[i]) for i in size(x, 1);跨度>
  • @Adrian:您示例中的语法似乎是错误的,至少对于方程式而言。你会把它放在哪里?
  • 我还没有测试过,所以可能有点不对劲。在方程式中,您将使用 for 循环。
  • 也许您可以将赋值移动到一个函数中,然后使用此处所述的自动矢量化:mbe.modelica.university/behavior/arrays/functions/… 另外请务必阅读有关数组理解的内容:mbe.modelica.university/behavior/arrays/construction/…

标签: arrays vector indexing modelica


【解决方案1】:

不幸的是,Modelica 中没有数组过滤,所以x&gt;=3 不起作用,也没有与之相媲美的东西。

但是仍然有一些方法可以得到结果向量,这取决于你想要一个方程还是一个算法。在使用方程式的模型中,您可以例如使用array constructor with one iterator:

model DemoModel
  Real x[5]={1,2,3,4,5};
  Real y[:]= {if i >= 3 then 1 else sin(i) for i in x};
end DemoModel;

使用这种方法,所有元素都被一次性赋值。在模型中,它不可能只更新符合条件的值(或者至少我不知道该怎么做),因为:

  • 在翻译过程中必须知道向量大小
  • 向量的每个元素都需要一个方程

使用过滤器,方程的数量会动态变化,具体取决于x 的值和条件。

在函数内部你有更多的可能性(你可以有灵活的数组大小),但是当你在模型中使用函数的输出时,你又面临着同样的限制。

【讨论】:

  • 谢谢 Marco,我认为你在正确的轨道上,在这种情况下,“x”恰好是“1,2,3,4,5”,即“for i”的“i”在 x"-表达式中(我怀疑是一样的吗?),但可以说 x=[100,10,0.1,0.01,0.001],所以条件是,例如(matlab 语法)for i=1:5if x(i)&gt;=10`y (i)=1`endend
  • 谢谢 Marco,我认为你在正确的轨道上,在这种情况下,“x”恰好是“1,2,3,4,5”,即“for i”的“i”在 x"-expression 中(我怀疑是一样的吗?)但可以说 x=[100,10,0.1,0.01,0.001],所以条件是,例如(matlab 语法)for i=1:5; if x(i)&gt;=10; y(i)=1; end; end;it似乎编辑器忽略了新行,我还没有弄清楚如何正确编写 cmets)
  • 这是公式的实际样子。 y :=vector((1)./ ((1).+ (log(x100 ./ x) / log(x100 / x50)) .^ b));这里,x 是自变量,y 是评估的。 b,x50 和 x100 是参数。对于 x>x100,表达式将 y 评估为“nan”(“不是数字”),但我想将值“1”分配给 y,其中对应的 x 大于 x100。
  • 我设法用“for”循环解决它,一个一个地改变元素,但我认为应该有一个更紧凑的语法,类似于matlab的“ y(x>=x100) =1 "
  • 不,没有那样的东西。请参阅更新的答案。 foo 循环可能是最简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 2020-06-28
  • 2016-08-01
相关资源
最近更新 更多