【问题标题】:Building up a matrix建立一个矩阵
【发布时间】:2014-03-15 23:45:33
【问题描述】:

我有一个函数,叫它 foo,它在输入中添加一个随机数。此过程执行两次并作为列表收集,即

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

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

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

注意这里的元素 a 和 b 是象征性的,在实际操作中将是浮点数。

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

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

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

【问题讨论】:

    标签: matrix clojure


    【解决方案1】:

    我想将上述过程重复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]]
    

    【讨论】:

    • 如果我想添加另一个输入 bobar 并将其放在部分 `(repeatedly (+ (+ bobar (rand)) (- bobar (rand))) 我遇到错误 ClassCastException。我相信这源于反复成为无参数的函数。那么,我将如何修改该部分以接受参数?
    • @sunspots 将内部位转换为无参数 #(...) 的匿名函数,该函数关闭 bobar(如所写)。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 2021-02-08
      相关资源
      最近更新 更多