我正在使用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循环的输出作为一个传递 列表函数的参数。但是,我只获得了从matrix-T返回的do循环输出。无论如何我可以纠正这个吗?
答案 0 :(得分: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))
答案 1 :(得分: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)))))
答案 2 :(得分: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"))