建立一个矩阵

时间:2014-03-15 23:45:33

标签: matrix clojure

我有一个函数,称之为foo,它为输入添加一个随机数。这个过程进行两次并作为列表收集,即

(defn foo [x] (vec (list (+ x (rand)) (+ x (rand)))))

将总和收集到索引结构[a b]后,我想再次为每个元素添加一个随机数(更常见的是能够进行多次算术运算)。

(map #(+ % (rand)) [a b])  

请注意,元素a和b在此处是符号,并且在实际操作中将是浮点。

现在我到达这篇文章的主要观点并且我想重复上述过程20次,并将迭代输出为20x2矩阵。这是我被困在建筑中的地方。

此外,我想从头开始循环这个过程,以便rand再次添加到我的输入x,给出两个新的索引元素[a'b']。请记住,'和b'是浮点的符号表示,素数用于区分元素和第一个循环。然后将这些索引元素反馈到映射中并再完成20次。

这个最后一步我想在函数中作为输入参数,这样我就可以控制为映射阶段创建的索引元素的数量(完成20次)。

2 个答案:

答案 0 :(得分:2)

  

我想重复上述过程20次,并输出迭代次数

然后您正在寻找iterate

  

我想在函数中作为输入参数,以便我能够控制创建的索引元素的数量。

然后您正在寻找repeat

(defn bar [init ncols nrows] 
  (take 
    nrows 
      (iterate
        (partial map + (repeatedly rand)) 
        (repeat ncols init))))

(->> (bar 0 2 20) (mapv vec))

=>; [[0 0]
  ;  [0.1600773061377655 0.25622198504430205]
  ; .
  ; . (20 rows in all) 
  ; .
  ;[3.0414688166175456 4.86821771584174]]

答案 1 :(得分:1)

我建议使用core.matrix进行此类数组/矩阵处理。这可能比从头开始手动编写所有数组操作例程容易得多。请参阅:https://github.com/mikera/core.matrix

您可以使用许多core.matrix函数来实现您的要求:

  • emap - 将函数应用于多维数组的每个元素
  • slices - 获取一系列数组切片