Clojure中的块对角矩阵

时间:2013-12-18 17:51:07

标签: clojure clojure-contrib

我查看了core.matrix搜索块对角矩阵函数并搜索了Google,但没有找到这样的函数。这样的功能存在吗?如果没有,有人可能会指出我正确的方向来编写这样的功能。

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

符号示例: 设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]]。

2 个答案:

答案 0 :(得分:4)

首先,您需要一个函数来生成大小为 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 可以替换为矩阵。

答案 1 :(得分:0)

库Vectorz(提供vectorz-clj的基础类型)包括BlockDiagonalMatrix类:

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

  • 内存效率 - 仅存储块对角线组件
  • 优化操作 - 各种矢量操作利用矩阵的大面积保证为零以便执行更快计算的事实

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