【问题标题】:Block Diagonal Matrix in ClojureClojure 中的块对角矩阵
【发布时间】:2013-12-22 00:34:04
【问题描述】:

我通过 core.matrix 搜索块对角矩阵函数并搜索了谷歌,但没有找到这样的函数。有这样的功能吗?如果没有,有人可以指出我编写这样一个函数的正确方向。

样本输入将是嵌套向量,它将沿较大嵌套向量的对角线输出。

象征性的例子: 设 a,b,c,d 为矩阵(嵌套向量)。 示例输出如下所示

 [[a 0 0 0] [0 b 0 0] [0 0 c 0] [0 0 0 d]]

其中 d 可能是 [[0 1] [1 0]]。

【问题讨论】:

标签: clojure clojure-contrib


【解决方案1】:

首先,您需要一个函数来生成大小为 n 的向量,其中元素 m 被注入到第 i 个位置。

(defn vec-i [m i n]
  (-> (repeat n 0)
      (vec)
      (assoc-in [i] m)))

(vec-i 'a 0 10) => [a 0 0 0 0 0 0 0 0 0]
(vec-i 'b 2 7) => [0 0 b 0 0 0 0]

然后只需合并每个 i 的结果(假设 matrices 是您的对角线元素列表)

(defn block-diag [matrices]
  (let [n (count matrices)]
    (vec (map-indexed #(vec-i %2 %1 n) matrices))))

(block-diag ['a 'b 'c 'd]) => [[a 0 0 0] [0 b 0 0] [0 0 c 0] [0 0 0 d]]

当然,符号abcd可以替换成矩阵。

【讨论】:

    【解决方案2】:

    Vectorz 库(为 vectorz-clj 提供基础类型)包含一个 BlockDiagonalMatrix 类:

    您现在必须使用 Java 互操作来实例化它,但它提供了几个优点:

    • 内存效率 - 仅存储块对角线分量
    • 优化运算 - 各种向量运算利用矩阵的大部分区域保证为零的事实,以执行更快的计算

    从长远来看,将block-diagonal-matrix 函数添加到core.matrix 本身可能是有意义的。事实上,我刚刚创建了一个问题来执行此操作:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多