【问题标题】:Using lisp code in maxima在 maxima 中使用 lisp 代码
【发布时间】:2014-03-04 13:08:44
【问题描述】:

我想在 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 代码。任何形式的帮助都应受到高度重视。

【问题讨论】:

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


    【解决方案1】:

    要在 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 对数组的处理仍然是一团糟……也许有一天我们会清理它。

    【讨论】:

      【解决方案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 的当前数组/矩阵语义是一团糟 […]”

      【讨论】:

      • 我得到的输出是Lisp array [4,3,8]..我需要启用一些选项吗?
      • 不,这对我来说在 Maxima 5.24.0 中开箱即用,但可能在更新的版本中发生了变化。顺便说一句,我将答案扩展为包括array(默认情况下创建后也不会打印结果数组)并提供了一些链接。也许这会进一步帮助你。
      • 查看它的另一种方法是在显示输出的表达式中引入一些错误,例如前arrayinfo(t);=> Lisp array [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))) 排名错误`
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      相关资源
      最近更新 更多