2014-03-04 38 views
4

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

我可以用:lisp (make-array '(4 3 8))执行它,但我不知道我怎样才能将其标记为类似,

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

我也想知道是否可以使用里面最大的功能Lisp代码。任何形式的帮助都应得到高度重视。

回答

5

要在Lisp代码名为阵列刚一摸一样array(name, d1, d2, ..., dm),写:

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

不能在千里马functi直接包括Lisp代码附件。但是你可以调用Lisp函数。如果lisp函数被命名为$foo,那么在Maxima中它是foo;如果在Lisp中是foo,那么在Maxima中它是?foo。例如:

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

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

顺便说一句,千里马处理数组仍然是一团糟...也许有一天我们会清理它。

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, #####, #####, #####, #####, 
#####, #####, #####, #####, #####, #####, #####, #####, #####, #####, #####, 
#####, #####, #####, #####, #####, #####] 

似乎有对这种事情在千里马相当多的选择,或如上面链接维基文章引述罗伯特Dodier:“千里马目前的阵列/矩阵语义是一个烂摊子[...]”

+0

我得到输出为'Lisp数组[4,3,8]'..我需要启用某些选项吗? – Rorschach

+0

不,这对Maxima 5.24.0开箱即可使用,但可能会在更新的版本中更改。顺便说一句,我扩大了答案,包括'数组'(它也不打印在默认情况下创建后产生的数组)并提供了一些链接。也许这会进一步帮助你。 – danlei

+0

通过在显示输出的表达式中引入一些错误,比如传递一些不完整的索引以及ex -arrayinfo(t);'=>'Lisp数组[2,3,4]',抛出错误,示例 - 't [1] [2];'=>'PROGN [或被调用者]中的错误:#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)))具有错误的等级' – Rorschach