2012-11-02 12 views
0

我正在編寫lisp中的矩陣轉置函數。我的方法可以從下面的代碼中可以看出:傳遞函數輸出作爲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

您這樣循環沒有在任何返回值子窗體,所以它返回NIL。它只是用FORMAT函數將輸出打印到'* STANDARD-OUTPUT *'。你想要返回什麼? – Barmar

+0

我只是想讓它返回它輸出的文本 – category

+0

但是輸出和返回值不是一回事。你真的想讓'matrix-T'返回一個字符串列表而不是一個新的矩陣嗎? – Barmar

回答

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)) 
+0

非常感謝,我使用了列表,因爲它們看起來更加靈活,但這同樣快。 – category

+0

@Bcket:對於列表,您可以使用另一個答案中顯示的apply mapcar列表。然而,在Common Lisp中將矩陣表示爲數組通常更加自然和高效,因爲它具有真正的多維數組。 – Svante

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))))) 
+0

非常感謝,請問爲什麼迭代器只返回完整的結果列表? – category

+0

它返回你告訴它返回的任何內容。該機構僅用於執行操作。如果你想要一個自動將數據收集到返回列表中的迭代宏,可以使用'loop'和'collect'操作。 – Barmar

+0

我的意思是爲什麼它不返回到完成列表的步驟,只是最終結果? – category

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")) 
+0

'mapcar *'是什麼,它和'mapcar'有什麼不同?除此之外,這對於使用列表來說是一個非常簡單的方法。 – Svante

+0

mapcar *是'cl-mapcar'的emacslisp中的別名。cl-mapcar是'cl-lib.el'中已編譯的Lisp函數。 (cl-mapcar FUNCTION SEQ ...) 對SEQ的每個元素應用FUNCTION,並列出結果列表。 如果有多個SEQ,則使用該許多參數調用FUNCTION,並且一旦最短列表用完,映射就會停止。只有一個 SEQ,這就像'mapcar'。有幾個,它就像Common Lisp 'mapcar'函數擴展到任意序列類型。 – user308879

相關問題