0

我正在用 lisp 编写矩阵转置函数。从以下代码可以看出我的做法:

(defun matrix-T (matrix)
  (cond ((null matrix) matrix)
        (t (list
            (do ((i 0 (+ i 1)))
                ((> i (length matrix)))
              (format t "(mapcar #'(lambda (x)(nth ~A x)) matrix)  %" i))))))

如您所见,我试图从 do 循环中获取输出以作为 list 函数的参数传递。但是,我只得到从 matrix-T 返回的 do 循环输出。无论如何我可以纠正这个问题吗?

4

3 回答 3

2

转置矩阵的一种非常简单直接的方法:

(defun transpose-matrix (matrix)
  (let ((result
         (make-array (reverse (array-dimensions matrix))
                     :element-type (array-element-type matrix))))
    (dotimes (i (array-dimension result 0) result)
      (dotimes (j (array-dimension result 1))
        (setf (aref result i j) (aref matrix j i))))))

(print
 (transpose-matrix
  #2A((1 2 3)
      (4 5 6))))
;; #2A((1 4) (2 5) (3 6)) 
于 2012-11-02T18:56:40.443 回答
1

您需要实际运行 MAPCAR 并将其结果收集到一个列表中,而不仅仅是打印或将其作为字符串返回。

(defun matrix-T (matrix)
  (cond ((null matrix) matrix)
        (t (do ((i 0 (1+ i))
                (result '())
                (cols (length (car matrix))))
               ((>= i cols) (nreverse result))
             (push (mapcar #'(lambda (x) (nth i x)) matrix) result)))))
于 2012-11-02T16:45:36.037 回答
0

使用 mapcar* 进行转置的优雅方式

(defun transpose-matrix (matrix)
  (apply #'mapcar* #'list matrix))

(transpose-matrix '(("1" "a" "e") ("2" "b" "f") ("4" "c" "g") ("5" "d" "h")))

(("1" "2" "4" "5") ("a" "b" "c" "d") ("e" "f" "g" "h"))
于 2013-08-11T01:19:57.507 回答