在maxima中使用lisp代码

时间:2014-03-04 13:08:44

标签: lisp common-lisp maxima computer-algebra-systems

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

顺便说一句,Maxima对阵列的处理仍然是一团糟......也许有一天我们会把它清理干净。

答案 1 :(得分: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也可能对你有用。我从来没有使用它,并且最初感到困惑,因为它在创建后没有打印。但在查看documentationWikibooks文章之后:

(%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当前的数组/矩阵语义是一团糟[...]”