4

我想(make-array '(4 3 8))在 maxima 中使用,它基本上是为了生成多维矩阵,因为我无法找到 API 来创建包括 with 在内的多维矩阵array(name,d1,d2...dm)

我可以使用它来执行它,:lisp (make-array '(4 3 8))但我不知道如何将它标记为类似,

arr: :lisp(make-array '(4 3 8))

我还想知道是否可以在 maxima 函数中使用 lisp 代码。任何形式的帮助都应受到高度重视。

4

2 回答 2

5

要在 Lisp 代码中创建与 完全相同的命名数组array(name, d1, d2, ..., dm),请编写:

(mfuncall '$array name d1 d2 ... dm)

您不能将 Lisp 代码直接包含在 Maxima 函数中。但是你可以调用 Lisp 函数。如果 lisp 函数被命名$foo,那么在 Maxima 中它是foo; 如果在 Lisp 中是foo,那么在 Maxima 中是?foo。例如:

:lisp (defun $foo (x) ...)

f(x) := print (foo (x));

顺便说一句,Maxima 对数组的处理仍然是一团糟……也许有一天我们会清理它。

于 2014-03-04T19:37:43.113 回答
2

您可以使用make_array直接创建数组:

(%i18) make_array(fixnum,4,3,8);
(%o18) {Array:  #3A(((0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0))
    ((0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0))
    ((0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0))
    ((0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0)))}

或者像这样绑定 Lisp 调用的结果:

(%i21) :lisp (msetq $foo (make-array '(4 3 8)));

#3A(((NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL))
    ((NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL))
    ((NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL))
    ((NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL)))
(%i21) foo;
(%o21) {Array:  #3A(((NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL))
    ((NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL))
    ((NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL))
    ((NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL)
     (NIL NIL NIL NIL NIL NIL NIL NIL)))}

顺便说一句,array可能也为你工作。我从来没有使用过它,一开始很困惑,因为它在创建后没有打印出来。但是在检查了文档Wikibooks文章之后:

(%i22) array(A,2,2,2);
(%o22)                                 A
(%i23) arrayinfo(A);
(%o23)                     [declared, 3, [2, 2, 2]]
(%i24) A[0,1,2]: 2;
(%o24)                                 2
(%i25) listarray(A);
(%o25) [#####, #####, #####, #####, #####, 2, #####, #####, #####, #####, 
#####, #####, #####, #####, #####, #####, #####, #####, #####, #####, #####, 
#####, #####, #####, #####, #####, #####]

Maxima 中似乎有很多此类事情的选择,或者,正如上面链接的 Wikibooks 文章引用 Robert Dodier 的话:“Maxima 当前的数组/矩阵语义是一团糟 […]”

于 2014-03-04T15:22:03.987 回答