2011-04-29 63 views
4

我試圖在Clojure中創建一個人口稀少的多維向量,但是我正在抵抗我的知識極限。clojure中人口稀少的多維向量?

我有一個集合x我遍歷,我想通過(count x)創建一個大小(count x)的多維向量。大多數單元格都是空的,但是在x軸和y軸匹配的每個點(例如(1 1),(2 2),(3 3)等),我需要運行函數來查看是否應該把價值放在這個空間裏。

在程序語言,這將是這樣的:

for (i = 0; i < length(x); i++) { 
    for (j = 0; j < length(x); j++) { 
     if (i == j && testReturnsTrue(x[i])) { 
      table[i][j] = (list x[i]) 
     } 
     else { 
      table[i][j] =() 
     } 
    } 
} 

但我不能換我的頭圍繞如何,這將在Clojure中來完成。我試圖使用嵌套的理解和嵌套循環復發結構,但我無法得到任何工作。

或者,我可以創建一個具有正確大小的可變表,將它初始化爲空列表,然後設置值作爲我檢查x中的每個元素,但是我希望在可能的情況下保持表不變。

+0

FWIW「疏」是指東西,顯然混淆大家誰的回答。如果你的矢量稍後將被填滿並且只是稀疏*現在*,那麼面向稀疏的技術就沒有多大意義。我建議你改變或澄清問題。 – amalloy 2011-04-29 16:57:55

回答

4

嵌套for s是我會怎麼做:

(def x [:a :b :c :d]) 
(vec (for [i (range (count x))] 
     (vec (for [j (range (count x))] 
       (if (and (= i j) (identity (x i))) 
       [(x i)] 
       []))))) 
=> [[[:a] [] [] []] [[] [:b] [] []] [[] [] [:c] []] [[] [] [] [:d]]] 

(identity (x i))是替身一種考驗。

編輯:正如在其他答案中所提到的,如果這個結構仍然稀疏填充,哈希映射是一個更好的選擇。我假設你將在後面的計算中填充空白部分。

+0

非常好,謝謝!我將填充表格的其餘部分,這只是將數據放入對角線的第一遍。 – stomcavage 2011-04-29 16:53:19

+0

即使你填充了其餘部分,除非你想按照數字順序遍歷鍵,hashmap至少是一樣的。如果你只是隨機訪問,我認爲hashmap更清晰。 – amalloy 2011-04-29 16:55:22

11

使用散列表?沒有必要使用一個不能稀疏的矢量。另外,這種必要的解決方案看起來並不稀疏 - 它浪費了存儲無數空單元的內存。也許是這樣的:你用這個詞

(let [indexed (map-indexed vector xs)] 
    (reduce (fn [m [i x]] 
      (if (test? x) 
       (assoc-in m [i i] x) 
       m)) 
      {} 
      indexed))