我正在寻找一个用于矩阵代数的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包?
答案 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-object
和print-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)))))))
(未经测试的原型。我使用elt
和map
,因此您可以将行和列名称表示为任何序列,但您可能希望更改它以提高效率。)
答案 1 :(得分:0)
您可以结帐:http://common-lisp.net/project/lisplab/
Lisplab包含
- 类似Matlab的矩阵操作
- 与BLAS和LAPACK的接口
- 与FFTW的接口
- 通过QUADPACK进行数值积分
- SLATEC的特殊功能
- 线性代数,postscript输出,PGM输出,快速傅里叶变换(原生Common Lisp),中缀数学等许多特定于Lisplab的例程。