2016-02-27 64 views
-2

我想在clojure向量上運行一些算術,但我似乎無法得到它的任何工作。我有這些載體....算法向量Clojure

locs - [[3 3] [5 5] [1 1] [2 2]] 
tlocs - [[2 2] [4 5]] 
rng - [2] 

我想要做的是迭代或復發過LOCS並採取第一組號碼,並檢查其對第一套tlocs的,看看他們的範圍內的數據在rng中。因此,舉例來說,首先要檢查[3 3]是否在範圍[2 2]內,然後檢查[5 5]是否在[2 2]的範圍內,而不是它的範圍。一旦我完成了對tlocs中第一個集合的所有loc值,它將會再次執行,但是使用[4 5]進行比較。

任何人都可以幫我寫一個函數嗎?

我試圖做這樣的事情,但它不工作和does not看起來右無論是

(defn check [locs tlocs rng 0] 
(loop [locs tlocs rng 0] 
    (<= (first t (first d)r) 
    (recur (rest locs) (inc index))))) 
+1

你能指定「範圍內」的含義嗎?爲什麼在[2 2]和[5 1]範圍內的'[3 3]'不是?如果函數'check':0在參數列表中是不允許的。 'loop'看起來很狡猾:你會影響'locs'和'rng'參數。 – mobiuseng

+0

範圍內,米的距離,例如最大範圍是2米,[3 3]距離[2 2]僅1米。但[5 5],5 - 2 = 3因此超出範圍超出範圍2。但它在第二個tloc的範圍內[4 5] – Freeman

+1

您想要結果是什麼? – mobiuseng

回答

2

這裏,你可以把它寫一個方法:

(defn in-range? [loc tloc rng] 
    (every? #(<= % rng) (map (comp #(Math/abs %) -) loc tloc))) 

(defn check [locs tlocs rng] 
    (every? true? (for [tloc tlocs loc locs] (in-range? loc tloc rng)))) 

因此,對於價值的每一個可能的配對在​​和值locs中,檢查loc是否在tloc的範圍內。如果有任何範圍檢查返回false,則返回false

例子:

(def locs [[3 3] [5 5] [1 1] [2 2]]) 
(def tlocs [[2 2] [4 5]]) 
(def rng 2) 

(check locs tlocs rng) ;=> false 

不過,我仍然不能確定這是否是你想要的。 in-range?不檢查loctloc之間的歐幾里得距離;它只是確保每個維度的座標之間的絕對差值小於rng

+0

是的,那是什麼後,我不認爲我解釋得很好。我在每個維度的座標之後小於範圍。只要確保他們不太遠 – Freeman