我正在尝试在clojure中对Vectors进行一些算术运算,但我似乎无法使其中的任何一个工作。我有这些载体......
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中的第一个集合完成了所有locs值,它将再次进行,但使用[4 5]进行比较。
任何人都可以帮我写一个能做到这一点的函数吗?
我尝试过这样的事情,但它不起作用,看起来也不正确
(defn check [locs tlocs rng 0]
(loop [locs tlocs rng 0]
(<= (first t (first d)r)
(recur (rest locs) (inc index)))))
答案 0 :(得分: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))))
因此,对于tlocs
中的值和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?
并未检查loc
和tloc
之间的欧几里德距离;它只是确保每个维度的坐标之间的绝对差值小于rng
。