2

我通过 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]]。

4

2 回答 2

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可以替换为矩阵。

于 2013-12-18T18:53:26.290 回答
0

Vectorz 库(为 vectorz-clj 提供底层类型)包括一个BlockDiagonalMatrix类:

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

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

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

于 2013-12-21T16:34:04.937 回答