如何根据 Mathematica 中的 if 语句将不同的方程式应用于列表中的元素

How to apply different equations to elements in a list based on if statements in Mathematica

我有很多列表,每个元素代表一家公司。

例如:

b = {1, 2, 3, 4, 5} 
c = {3, 4, 6, 8, 9}

表示公司 1 有 b=1,c=3,公司 2 有 b=2,c=4 等等

我试图在不使用循环的情况下编写一系列条件语句。

例如,如果公司 'x' 有 z > 0,那么我希望它以一种方式更新 a、d、g,如果 z < 0 我希望它更新 a、d、g换个方式。

我尝试使用 If 命令,但它似乎不适用于包含多个元素的列表。

If [z > 0,
 a = b + c;
 d = e - f;
 g = h - i - j;
 ,
 a = n - o;
 d = p - q;
 g = w + y]

我已经尝试过 MapThread 命令,但似乎只能让它为一行代码工作。 例如。对于一个:

a = MapThread[If[#1 > 0, #2 + #3 , #4 - #5] &, {z, b, c, n, o}]

但是如果我必须为每一行都写这个,这会变得很麻烦。

有没有不使用循环的简单方法来实现它?

举几个例子。

a = d = g = ConstantArray[Null, 5];
b = {1, 2, 3, 4, 5};
c = {3, 4, 6, 8, 9};
e = {8, 4, 0, 4, 4};
f = {4, 9, 6, 5, 4};
h = {5, 8, 8, 7, 1};
i = {3, 3, 4, 4, 5};
j = {2, 6, 3, 4, 1};
n = {7, 3, 1, 8, 8};
o = {7, 8, 8, 4, 3};
p = {8, 3, 8, 9, 4};
q = {6, 5, 1, 6, 2};
w = {9, 5, 7, 7, 4};
y = {6, 5, 8, 9, 2};
z = {6, 2, 1, 3, 0};

Array[
  If[z[[#]] > 0,
    a[[#]] = b[[#]] + c[[#]];
    d[[#]] = e[[#]] - f[[#]];
    g[[#]] = h[[#]] - i[[#]] - j[[#]];
    ,
    a[[#]] = n[[#]] - o[[#]];
    d[[#]] = p[[#]] - q[[#]];
    g[[#]] = w[[#]] + y[[#]]] &, Length[z]];

{a, d, g}

{{4, 6, 9, 12, 5}, {4, -5, -6, -1, 2}, {0, -1, 1, -1, 6}}

为清楚起见,将 MapThread 与局部函数名称一起使用。

{a, d, g} = Transpose@MapThread[Function[
     {b, c, e, f, h, i, j, n, o, p, q, w, y, z},
     If[z > 0, {b + c, e - f, h - i - j}, {n - o, p - q, w + y}]],
    {b, c, e, f, h, i, j, n, o, p, q, w, y, z}]

{{4, 6, 9, 12, 5}, {4, -5, -6, -1, 2}, {0, -1, 1, -1, 6}}

使用 ReplaceAllRuleDelayed 本地化的名称。

{a, d, g} = Transpose[
  Transpose@{b, c, e, f, h, i, j, n, o, p, q, w, y, z} /.
   {b_, c_, e_, f_, h_, i_, j_, n_, o_, p_, q_, w_, y_, z_} :>
    If[z > 0, {b + c, e - f, h - i - j}, {n - o, p - q, w + y}]]

{{4, 6, 9, 12, 5}, {4, -5, -6, -1, 2}, {0, -1, 1, -1, 6}}