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 に答える