Matrix 用CommonLisp编写一个简单的矩阵类供练习
普通lisp新手。编写lisp代码与编写c++/java完全不同,正如我以前编写的那样 我正在尝试用CommonLisp编写一个简单的矩阵类以供练习。有些代码是这样的:Matrix 用CommonLisp编写一个简单的矩阵类供练习,matrix,lisp,elisp,common-lisp,Matrix,Lisp,Elisp,Common Lisp,普通lisp新手。编写lisp代码与编写c++/java完全不同,正如我以前编写的那样 我正在尝试用CommonLisp编写一个简单的矩阵类以供练习。有些代码是这样的: (defun make-matrix (row col) (make-list row :initial-element (make-list col :initial-element nil))) (defun init-matrix (matrix init-value) (labels ((set-element
(defun make-matrix (row col)
(make-list row :initial-element (make-list col :initial-element nil)))
(defun init-matrix (matrix init-value)
(labels ((set-element-value (lst)
(if (and lst
(listp lst))
(mapcar #'set-element-value lst)
(setf lst init-value))))
(set-element-value matrix)))
(defun matrix+ (&rest matrices)
(apply #'mapcar (lambda (&rest rows)
(apply #'mapcar #'+ rows)) matrices))
我的问题是,我可以写一个矩阵+接受不同数量的参数而不“应用”,还是以更好的方式?在某种程度上lisp应该是
那么矩阵*,有人能给我看一些很棒的代码,可以接受矩阵*中任意数量的参数吗?谢谢。Common Lisp有n维数组。我会把它们用于矩阵运算 请参阅:
MAKE-ARRAY
,AREF
通常,我还会编写一个二进制(带两个参数)矩阵运算。然后使用REDUCE
对矩阵列表进行操作
CL-USER > (make-array '(3 5) :initial-element 0)
#2A((0 0 0 0 0) (0 0 0 0 0) (0 0 0 0 0))
上面创建了一个大小为3x5的二维数组,初始内容为0。矩阵乘法。我不能保证这是最好的例子,但它确实是直截了当的。这是因为您使用数组而不是列表。当然,你也可以优化正方形矩阵,或者特殊情况,比如恒等式矩阵等等。但是这只是简单的,不是有效的等等
(defun matrix* (&rest matrices)
(assert (cdr matrices) nil
"You will achieve nothing by multiplying a single matrix.")
(reduce
#'(lambda (a b)
(assert (= (array-dimension a 0) (array-dimension b 1)) nil
"The number of rows in the first matrix should be the number ~
of columns in the second matrix")
(let ((result
(make-array
(list (array-dimension a 1) (array-dimension b 0))
:initial-element 0)))
(dotimes (i (array-dimension a 1) result)
(dotimes (j (array-dimension b 0))
(dotimes (k (array-dimension a 0))
(incf (aref result i j) (* (aref a k i) (aref b j k))))))))
matrices))
(format t "result: ~s~&" (matrix* #2A((1 2) (3 4)) #2A((5 6) (7 8))))
;; #2A((23 31) (34 46)) =
;; (1 * 5 + 3 * 6 = 23) (1 * 7 + 3 * 8 = 31)
;; (2 * 5 + 4 * 6 = 34) (2 * 7 + 4 * 8 = 46)
也许我应该停止这种简单的练习,找点东西来代替。。。我将查看该文件以了解更多详细信息。谢谢。@wvxvw我稍后再看。