0

这很难解释,但很容易展示。不知道为什么我自己没有弄清楚,所以我一定在clojure中遗漏了一些显而易见的东西。

我需要将向量与其自身组合成一个向量,并且我需要将第一个元素与所有剩余元素组合,然后将第二个元素与所有剩余元素(第三个及之后)组合起来。

作为一个简短的例子:[1 2 3 4 5]

我需要一个函数来获取:[[1 2] [1 3] [1 4] [1 5] [2 3] [2 4] [2 5] [3 4] [3 5]]

如果这看起来像是为大型矩阵获得了一半的对,那么您是对的。我只想解决一半的矩阵减去中间对角线。这是我唯一需要顺序的部分(所以我只解决了一半),其余部分我想使用 reducers 库在后台并行化较重的数学。

提前致谢!

4

3 回答 3

3

我只是使用一个for

(for [ i (range 1 6) j (range 6) :when (< i j)] [i j])
; => ([1 2] [1 3] [1 4] [1 5] [2 3] [2 4] [2 5] [3 4] [3 5] [4 5])
于 2013-02-27T22:48:15.273 回答
3

你想要的是内置在 clojure/math.combinatorics 中: https ://github.com/clojure/math.combinatorics

您正在寻找的基本示例在自述文件中,但为了完整回答这个问题,我将在此重复:

(ns example.core
    (:require [clojure.math.combinatorics :as combo]))

(combo/combinations [1 2 3] 2)
;;=> ((1 2) (1 3) (2 3))
于 2013-02-27T22:06:54.680 回答
0
(def v [1 2 3 4 5])

(for [i (range (count v)) 
      :let [vv (drop i v)] 
      r (rest vv)] 
  [(first vv) r])

=> ([1 2] [1 3] [1 4] [1 5] [2 3] [2 4] [2 5] [3 4] [3 5] [4 5])
于 2013-02-28T02:47:46.007 回答