2012-04-27 45 views
18

Trong clojure, một biểu diễn có thể có của ma trận là một vectơ của vec-tơ, tức là [[1 2] [3 4]]. Một thi thể của transposing một ma trận sẽ là:chuyển vị ma trận trong clojure

(defn transpose [matrix] 
    (loop [matrix matrix, transp [], i 0] 
    (if (< i (count (nth matrix 0))) 
     (recur matrix 
      (conj transp 
        (vec (reduce concat 
           (map #(conj [] (nth %1 i)) 
            matrix)))) 
      (inc i)) 
     transp))) 

bất cứ ai có thể nghĩ ra một thành ngữ hơn để thực hiện clojure? ví dụ để tránh lặp lại vòng lặp kinh khủng này?

+2

Bạn có biết về incanter? Nếu bạn cần các hoạt động ma trận khác nhau, nó có thể là nguồn cảm hứng - https://github.com/liebke/incanter/wiki/matrices – sw1nn

Trả lời

55

Giải pháp thông thường là

(defn transpose [m] 
    (apply mapv vector m)) 
17

Tính đến năm 2014, tôi sẽ khuyên bạn sử dụng core.matrix cho bất kỳ công việc số trong Clojure.

Trong số những thứ khác, điều này cung cấp việc triển khai của tất cả các hoạt động ma trận phổ biến nhất:

(use 'clojure.core.matrix) 

(transpose [[1 2] [3 4]]) 
=> [[1 3] [2 4]] 
+9

Tôi nghĩ bạn nên ít nhất đề cập đến rằng core.matrix được viết bởi bạn, nếu bạn sẽ giới thiệu nó. – amalloy

+9

Tôi sẽ giảm giá rằng ông là tác giả đưa ra thực tế thích hợp hơn rằng không gian tên mà ông đề xuất được thêm vào trước với các từ "clojure.core" – ctpenrose

+1

Đây là câu trả lời hợp lệ. Tôi không thấy cách từ chối trách nhiệm có thể cải thiện nó. ... Có thể cho rằng, điều này có thể không phải là clojure thành ngữ, nhưng các thư viện được tối ưu hóa là thành ngữ cho ops ma trận. – muhuk

Các vấn đề liên quan