如何在 Maxima 中生成索引变量的多维数组?

How to generate a multidimensional array of indexed variables in Maxima?

我想获取一个非负整数列表 D=[d1,...,dm] 并生成索引符号 A 的多维数组,形式为:

其中 0<=i_j<=d_j。例如,如果 D=[2,3] 那么 A 应该是

[[a_[0,0],a_[0,1],a_[0,2]],
 [a_[1,0],a_[1,1],a_[1,2]]]

对于这种情况,我可以嵌套两个 for 循环来生成所述数组,但是 D 的长度不一定为 2,而且我不知道如何嵌套任意数量的 for 循环!

如果您能帮助我了解如何从 D.

生成 A,我将不胜感激

P.S. 我最终想要实现的是创建一个多元多项式,如 here.

所述

这是一种方法。本质部分是我调用 cartesian_product 来构建所有索引组合的列表,然后 arrayapply 来创建下标表达式。

(%i11) ii:setify(makelist(i, i, 0, n)), n=2;
(%o11)                      {0, 1, 2}
(%i12) apply (cartesian_product, makelist (ii, m)), m=3;
(%o12) {[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 0], [0, 1, 1], 
[0, 1, 2], [0, 2, 0], [0, 2, 1], [0, 2, 2], [1, 0, 0], 
[1, 0, 1], [1, 0, 2], [1, 1, 0], [1, 1, 1], [1, 1, 2], 
[1, 2, 0], [1, 2, 1], [1, 2, 2], [2, 0, 0], [2, 0, 1], 
[2, 0, 2], [2, 1, 0], [2, 1, 1], [2, 1, 2], [2, 2, 0], 
[2, 2, 1], [2, 2, 2]}
(%i13) map (lambda ([l], arrayapply (_a, l)), %);
(%o13) {_a       , _a       , _a       , _a       , _a       , 
          0, 0, 0    0, 0, 1    0, 0, 2    0, 1, 0    0, 1, 1
_a       , _a       , _a       , _a       , _a       , 
  0, 1, 2    0, 2, 0    0, 2, 1    0, 2, 2    1, 0, 0
_a       , _a       , _a       , _a       , _a       , 
  1, 0, 1    1, 0, 2    1, 1, 0    1, 1, 1    1, 1, 2
_a       , _a       , _a       , _a       , _a       , 
  1, 2, 0    1, 2, 1    1, 2, 2    2, 0, 0    2, 0, 1
_a       , _a       , _a       , _a       , _a       , 
  2, 0, 2    2, 1, 0    2, 1, 1    2, 1, 2    2, 2, 0
_a       , _a       }
  2, 2, 1    2, 2, 2
(%i14) grind (%);

{_a[0,0,0],_a[0,0,1],_a[0,0,2],_a[0,1,0],_a[0,1,1],_a[0,1,2],
 _a[0,2,0],_a[0,2,1],_a[0,2,2],_a[1,0,0],_a[1,0,1],_a[1,0,2],
 _a[1,1,0],_a[1,1,1],_a[1,1,2],_a[1,2,0],_a[1,2,1],_a[1,2,2],
 _a[2,0,0],_a[2,0,1],_a[2,0,2],_a[2,1,0],_a[2,1,1],_a[2,1,2],
 _a[2,2,0],_a[2,2,1],_a[2,2,2]}$
(%o14)                        done

这只是在顶级交互提示下工作;如果您需要构造一个函数,我想您会看到如何去做。

编辑:这是创建多项式的方法。

(%i16) S : {[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 1, 0], [0, 1, 1], 
[0, 1, 2], [0, 2, 0], [0, 2, 1], [0, 2, 2], [1, 0, 0], 
[1, 0, 1], [1, 0, 2], [1, 1, 0], [1, 1, 1], [1, 1, 2], 
[1, 2, 0], [1, 2, 1], [1, 2, 2], [2, 0, 0], [2, 0, 1], 
[2, 0, 2], [2, 1, 0], [2, 1, 1], [2, 1, 2], [2, 2, 0], 
[2, 2, 1], [2, 2, 2]} $

(%i17) L : listify (S) $ 

(%i18) A : map (lambda ([l], arrayapply (_a, l)), L);
(%o18) [_a       , _a       , _a       , _a       , _a       , 
          0, 0, 0    0, 0, 1    0, 0, 2    0, 1, 0    0, 1, 1
_a       , _a       , _a       , _a       , _a       , 
  0, 1, 2    0, 2, 0    0, 2, 1    0, 2, 2    1, 0, 0
_a       , _a       , _a       , _a       , _a       , 
  1, 0, 1    1, 0, 2    1, 1, 0    1, 1, 1    1, 1, 2
_a       , _a       , _a       , _a       , _a       , 
  1, 2, 0    1, 2, 1    1, 2, 2    2, 0, 0    2, 0, 1
_a       , _a       , _a       , _a       , _a       , 
  2, 0, 2    2, 1, 0    2, 1, 1    2, 1, 2    2, 2, 0
_a       , _a       ]
  2, 2, 1    2, 2, 2
(%i19) U : map (lambda ([l], product (u[i]^l[i], i, 1, length(l))), L);
                2                 2   2   2      2  2
(%o19) [1, u , u , u , u  u , u  u , u , u  u , u  u , u , 
            3   3   2   2  3   2  3   2   2  3   2  3   1
           2                          2      2      2
u  u , u  u , u  u , u  u  u , u  u  u , u  u , u  u  u , 
 1  3   1  3   1  2   1  2  3   1  2  3   1  2   1  2  3
    2  2   2   2      2  2   2      2         2     2   2  2
u  u  u , u , u  u , u  u , u  u , u  u  u , u  u  u , u  u , 
 1  2  3   1   1  3   1  3   1  2   1  2  3   1  2  3   1  2
 2  2      2  2  2
u  u  u , u  u  u ]
 1  2  3   1  2  3
(%i20) A.U;                        
        2  2            2    2               2    2            2
(%o20) u  u  _a        u  + u  u  _a        u  + u  _a        u
        1  2   2, 2, 2  3    1  2   2, 1, 2  3    1   2, 0, 2  3
                 2  2              2  2                    2
 + u  _a        u  u  + _a        u  u  + u  _a        u  u
    1   1, 2, 2  2  3     0, 2, 2  2  3    1   1, 1, 2  2  3
                 2                 2              2
 + _a        u  u  + u  _a        u  + _a        u
     0, 1, 2  2  3    1   1, 0, 2  3     0, 0, 2  3
    2  2                 2                    2
 + u  u  _a        u  + u  u  _a        u  + u  _a        u
    1  2   2, 2, 1  3    1  2   2, 1, 1  3    1   2, 0, 1  3
                 2                 2
 + u  _a        u  u  + _a        u  u  + u  _a        u  u
    1   1, 2, 1  2  3     0, 2, 1  2  3    1   1, 1, 1  2  3
 + _a        u  u  + u  _a        u  + _a        u
     0, 1, 1  2  3    1   1, 0, 1  3     0, 0, 1  3
    2  2              2                 2
 + u  u  _a        + u  u  _a        + u  _a
    1  2   2, 2, 0    1  2   2, 1, 0    1   2, 0, 0
                 2              2
 + u  _a        u  + _a        u  + u  _a        u
    1   1, 2, 0  2     0, 2, 0  2    1   1, 1, 0  2
 + _a        u  + u  _a        + _a
     0, 1, 0  2    1   1, 0, 0     0, 0, 0

请注意,每个产品中术语的排序不符合人们通常认为的惯例,例如[1]^2*u[2]^2*_a[2,2,2]*u[3]^2 是第一项。 Maxima 根据下标对项进行排序,因此 _a[2,2,2]u[1] 之后和 u[3] 之前。在某些情况下,这与人类的期望相吻合,但在这里却并非如此;无论如何,Maxima 始终希望让程序化操作更好地工作。

(%i21) grind (%);

u[1]^2*u[2]^2*_a[2,2,2]*u[3]^2+u[1]^2*u[2]*_a[2,1,2]*u[3]^2
                              +u[1]^2*_a[2,0,2]*u[3]^2
                              +u[1]*_a[1,2,2]*u[2]^2*u[3]^2
                              +_a[0,2,2]*u[2]^2*u[3]^2
                              +u[1]*_a[1,1,2]*u[2]*u[3]^2
                              +_a[0,1,2]*u[2]*u[3]^2
                              +u[1]*_a[1,0,2]*u[3]^2
                              +_a[0,0,2]*u[3]^2
                              +u[1]^2*u[2]^2*_a[2,2,1]*u[3]
                              +u[1]^2*u[2]*_a[2,1,1]*u[3]
                              +u[1]^2*_a[2,0,1]*u[3]
                              +u[1]*_a[1,2,1]*u[2]^2*u[3]
                              +_a[0,2,1]*u[2]^2*u[3]
                              +u[1]*_a[1,1,1]*u[2]*u[3]
                              +_a[0,1,1]*u[2]*u[3]
                              +u[1]*_a[1,0,1]*u[3]
                              +_a[0,0,1]*u[3]
                              +u[1]^2*u[2]^2*_a[2,2,0]
                              +u[1]^2*u[2]*_a[2,1,0]
                              +u[1]^2*_a[2,0,0]
                              +u[1]*_a[1,2,0]*u[2]^2
                              +_a[0,2,0]*u[2]^2
                              +u[1]*_a[1,1,0]*u[2]
                              +_a[0,1,0]*u[2]+u[1]*_a[1,0,0]
                              +_a[0,0,0]$
(%o21)                        done