2013-12-18 82 views
2

我查看了core.matrix尋找塊對角矩陣函數並搜索了Google,但沒有找到這樣的函數。這樣的功能是否存在?如果沒有人能指出我寫正確的方向寫這樣的功能。Clojure中的塊對角矩陣

樣本輸入將是沿嵌套向量的對角線輸出的嵌套向量。

符號示例: 設a,b,c,d爲矩陣(嵌套向量)。然後 一個例子的輸出如下所示

[[a 0 0 0] [0 b 0 0] [0 0 c 0] [0 0 0 d]] 

其中d可以是[[0 1] [1 0]]。所有的

+0

你找對角矩陣? https://github.com/mikera/vectorz-clj/blob/develop/src/main/clojure/mikera/vectorz/matrix.clj#L109 – edbond

+0

只要對角元素可以是矩陣(嵌套向量)。 – sunspots

+0

您能否提供示例輸入和輸出? – mishadoff

回答

4

首先,需要一個函數來生成與注入到個位置元件大小Ñ的矢量。

(defn vec-i [m i n] 
    (-> (repeat n 0) 
     (vec) 
     (assoc-in [i] m))) 

(vec-i 'a 0 10) => [a 0 0 0 0 0 0 0 0 0] 
(vec-i 'b 2 7) => [0 0 b 0 0 0 0] 

然後,只需與結果相結合的每個i(假設matrices是你的對角線元素的列表)

(defn block-diag [matrices] 
    (let [n (count matrices)] 
    (vec (map-indexed #(vec-i %2 %1 n) matrices)))) 

(block-diag ['a 'b 'c 'd]) => [[a 0 0 0] [0 b 0 0] [0 0 c 0] [0 0 0 d]] 

當然,ABCD可更換式符號。

0

庫Vectorz(提供的基本類型vectorz-CLJ)包括BlockDiagonalMatrix類:

你將不得不使用Java的互操作現在進行實例化,但它提供了幾個advangtages:

  • 內存效率 - 只存儲塊對角元件
  • 優化操作 - 各種矢量操作利用了矩陣的大面積,保證是零,以便更快地執行計算

長期來看,事實上,它可能是有道理的block-diagonal-matrix功能添加到core.matrix本身。事實上,我剛剛創建了一個問題,要做到這一點: