Lisp中矩阵代数的行和列标签

时间:2014-10-21 08:31:13

标签: matrix lisp common-lisp linear-algebra

我正在寻找一个用于矩阵代数的Lisp包,它显示每行和每列的名称标签以及数据,这使得数据更容易阅读。

R做了这样的事情:

                 George     Micheal      Maria
1999-01-04 1.0442238472 1427.447631  88.808903  
1999-01-05 0.9944458362 1441.538069  88.730143   
1999-01-06 1.0233398966 1472.594545  88.743269   

是否有人知道具有此类功能的矩阵代数的Lisp包?

2 个答案:

答案 0 :(得分:1)

您可以使用简单的包装器自行添加行标签和列标签:

(defclass data-table ()
  ((matrix :initarg :matrix
           :reader data-table-matrix)
   (row-labels :initarg :row-labels
               :reader data-table-row-labels)
   (column-labels :initarg :column-labels
                  :reader data-table-column-labels)))

现在,定义一个读取函数,从打印表创建这样一个表,并编写一个写入函数。对于后者,您可以使用print-objectprint-unreadable-object的方法:

(defmethod print-object ((object data-table) stream)
  (print-unreadable-object (object stream)
    (let ((matrix (data-table-matrix object))
          (row-names (data-table-row-names object)))
      (format stream "~%          ");
      (map nil
           (lambda (name)
             (format stream "~,10a" name))
           (data-table-column-names object))
      (dotimes (i (array-dimension matrix 0))
        (format stream "~,10~a" (elt row-names i))
        (dotimes (j (array-dimension matrix 1))
          (format stream "~,10a" (aref matrix i j)))))))

(未经测试的原型。我使用eltmap,因此您可以将行和列名称表示为任何序列,但您可能希望更改它以提高效率。)

答案 1 :(得分:0)

您可以结帐:http://common-lisp.net/project/lisplab/

  

Lisplab包含

     
      
  • 类似Matlab的矩阵操作
  •   
  • 与BLAS和LAPACK的接口
  •   
  • 与FFTW的接口
  •   
  • 通过QUADPACK进行数值积分
  •   
  • SLATEC的特殊功能
  •   
  • 线性代数,postscript输出,PGM输出,快速傅里叶变换(原生Common Lisp),中缀数学等许多特定于Lisplab的例程。
  •