2016-05-11 57 views
2

例如,我有以下嵌套向量:Clojure的:應用一個嵌套矢量格式扁平矢量

[[[0.582198689235419 -0.34713183143727 0.4685311493624731] 
    [-0.38928013774079284 -0.5901700383677557 -0.37573234072157] 
    [0.6716356761877877 -0.19645167952721243 -0.5700686091940252]] 
[[0.0027162308840597005 -0.4483592764429284 -0.4766278022217257 -0.2724018313051576] 
    [-0.2765881229144672 -0.8030656496255356 -0.16159395457031567 -0.27432324260043084] 
    [-0.6154630466545907 -0.60573539482247 0.4417814561800192 -0.5559788990464504] 
    [0.6194560094536031 -0.3663074359460578 -0.5704311251195602 0.7194827876969362]]] 

和我有以下扁平載體:

(0.5366343712173423 
-0.816449781850872 
-0.16066485785704843 
0.9816561233924161 
-0.09646744313584676 
-0.2619662625757997 
-0.9946004265996822 
-0.14096299956754854 
0.579260850612288 
-0.827601452607939 
-0.24934665032374648 
-0.42272393175707873 
0.11239245249400165 
-0.29878238708035043 
-0.61522274672097 
0.8298721730401472 
0.5016214138116059 
0.11633537727916243 
-0.0631891708267196 
-0.26569217599364303 
0.20900664784109668 
0.2005869506108401 
-0.2658279978034501 
0.3383997403318165 
-0.09353513546647907) 

我想變平的矢量將被轉換爲嵌套矢量,該嵌套矢量遵循與上面呈現的嵌套矢量相同的結構。在Clojure中還是有一個核心函數?我對如何解決這個問題有一些想法,但是他們都看起來效率非常低,而且這個操作將與大型媒介一起使用。

非常感謝您提前。

回答

8

這是一個有趣的問題要回答,因爲它是我認爲使用拉鍊使事情變得更簡單而不是更難的少數幾次之一。這個想法是製作嵌套矢量的矢量拉鍊,來表示所需的結構,並重復調用zip/next;每當我們到達一個葉節點時,我們就用輸入序列中的下一個替換它的值。

請注意,這裏假定嵌套結構中的項目與平展列表中的項目完全相同;如果情況並非如此,你可能會得到某種錯誤,誰知道。

(require '[clojure.zip :as z]) 

(defn replace-values [structure values] 
    (loop [z (z/vector-zip structure) 
     values (seq values)] 
    (cond (not values) (z/root z) 
      (z/branch? z) (recur (z/next z) values) 
      :else (recur (-> z 
          (z/replace (first values)) 
          (z/next)) 
         (next values))))) 

user> (replace-values '[[[0.582198689235419 -0.34713183143727 0.4685311493624731] 
         [-0.38928013774079284 -0.5901700383677557 -0.37573234072157] 
         [0.6716356761877877 -0.19645167952721243 -0.5700686091940252]] 
         [[0.0027162308840597005 -0.4483592764429284 -0.4766278022217257 -0.2724018313051576] 
         [-0.2765881229144672 -0.8030656496255356 -0.16159395457031567 -0.27432324260043084] 
         [-0.6154630466545907 -0.60573539482247 0.4417814561800192 -0.5559788990464504] 
         [0.6194560094536031 -0.3663074359460578 -0.5704311251195602 0.7194827876969362]]] 
         '(0.5366343712173423 
         -0.816449781850872 
         -0.16066485785704843 
         0.9816561233924161 
         -0.09646744313584676 
         -0.2619662625757997 
         -0.9946004265996822 
         -0.14096299956754854 
         0.579260850612288 
         -0.827601452607939 
         -0.24934665032374648 
         -0.42272393175707873 
         0.11239245249400165 
         -0.29878238708035043 
         -0.61522274672097 
         0.8298721730401472 
         0.5016214138116059 
         0.11633537727916243 
         -0.0631891708267196 
         -0.26569217599364303 
         0.20900664784109668 
         0.2005869506108401 
         -0.2658279978034501 
         0.3383997403318165 
         -0.09353513546647907)) 

[[[0.5366343712173423 -0.816449781850872 -0.16066485785704843] 
    [0.9816561233924161 -0.09646744313584676 -0.2619662625757997] 
    [-0.9946004265996822 -0.14096299956754854 0.579260850612288]] 
[[-0.827601452607939 -0.24934665032374648 -0.42272393175707873 0.11239245249400165] 
    [-0.29878238708035043 -0.61522274672097 0.8298721730401472 0.5016214138116059] 
    [0.11633537727916243 -0.0631891708267196 -0.26569217599364303 0.20900664784109668] 
    [0.2005869506108401 -0.2658279978034501 0.3383997403318165 -0.09353513546647907]]] 
+0

謝謝!我會閱讀拉鍊。他們看起來有趣。 – amherag