2012-04-27 9 views
18

行列の可能な表現は、ベクトルのベクトル、すなわち[[1 2] [3 4]]です。行列の転置の 可能な実装は次のようになります。でのマトリックス転位

(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))) 

誰もがClojureの実装により慣用を考えることができますか?例えばこの恐ろしいループが繰り返されるのを避けるために?

+2

あなたがincanterについて知っていますか?さまざまな行列操作が必要な場合は、インスピレーションの源泉になる可能性があります - https://github.com/liebke/incanter/wiki/matrices – sw1nn

答えて

55

通常のソリューションは、2014年のよう

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

ですが、私はClojureの中の任意の数値仕事のためcore.matrixを使用することをお勧めします。とりわけ

、これはすべての最も一般的な行列演算の実装を提供します。

(use 'clojure.core.matrix) 

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

少なくとも、core.matrixはあなたが書いているそれを推薦するつもりです。 – amalloy

+9

私は彼が推薦する名前空間に "clojure.core"という単語が付加されているというより適切な事実を与えられた著者であることを批判します。 – ctpenrose

+1

これは有効な答えです。免責条項がどのようにそれを改善できるかはわかりません。 ...おそらく、これは慣用句ではないかもしれませんが、最適化されたライブラリは行列操作のために慣用的です。 – muhuk

関連する問題