san*_*san 8 lisp arrays scheme numpy common-lisp
是否有任何Lisp或方案方言对阵列和线性代数操作有很好的支持.通过良好的支持,我不是指BLAS/LAPACk的接口,而是语言本身的高效数组原语.比如说,如果它可以对抗Numpy,我认为它是有效率的.我听说Stalin非常快,但我对lisp很新,不熟悉语法上方便的操作和这种语言中多d数组的高效表示.如果有个人经验支持,指针(没有双关语意)将深受赞赏.
Rai*_*wig 12
标准Common Lisp中的数组可以是多维的.
该阵列词典描述了可用的操作.
CL-USER 12 > (defparameter *a* (make-array '(3 2 4) :initial-element 'foo))
*A*
CL-USER 13 > *a*
#3A(((FOO FOO FOO FOO) (FOO FOO FOO FOO))
    ((FOO FOO FOO FOO) (FOO FOO FOO FOO))
    ((FOO FOO FOO FOO) (FOO FOO FOO FOO)))
CL-USER 14 > (setf (aref *a* 1 1 2) 'bar)
BAR
CL-USER 15 > *a*
#3A(((FOO FOO FOO FOO) (FOO FOO FOO FOO))
    ((FOO FOO FOO FOO) (FOO FOO BAR FOO))
    ((FOO FOO FOO FOO) (FOO FOO FOO FOO)))
CL-USER 16 > (array-dimensions *a*)
(3 2 4)
使用数组时,使用Common Lisp的另一个特性可能很有用:类型声明和编译器优化.Common Lisp允许在不声明类型的情况下编写通用代码.但是在关键部分,可以为变量,参数,返回值等声明类型.然后可以指示编译器去掉一些检查或使用特定于类型的操作.支持量取决于编译器.还有更复杂的编译器,如SBCL,LispWorks和Allegro CL,它们支持各种优化.一些编译器也提供了大量的编译信息.
最后一种方法是使用外部函数接口(FFI)来调用C代码或使用内联汇编程序(某些编译器支持).
Common Lisp默认情况下是标准中的LOOP宏.它允许表达典型的命令性循环结构.还有一个替代方案,即ITERATE宏 - 它可能对多维数组有一些优势.
另请注意,Lisp数组具有一些不寻常的功能,如移位数组.这些使用其他一些数组的存储,但可以有不同的维度布局.
编写特殊宏有时也很有用,它隐藏了使用数组的样板.如果没有带有类型声明的Lisp代码,多维数组和LOOP可能会有点大.不使用特殊语言抽象的典型代码的示例如下:fft.lisp.
Common Lisp编译器通常不提供SIMD指令或其他形式的数据并行性的特殊用法.可能存在例外情况.