矢量Clojure的算法

时间:2016-02-27 13:00:38

标签: vector clojure

我正在尝试在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)))))

1 个答案:

答案 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?并未检查loctloc之间的欧几里德距离;它只是确保每个维度的坐标之间的绝对差值小于rng