Matrix 用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

普通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-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我稍后再看。