我通过 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]]。
我通过 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]]。
首先,您需要一个函数来生成大小为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可以替换为矩阵。
Vectorz 库(为 vectorz-clj 提供底层类型)包括一个BlockDiagonalMatrix
类:
您现在必须使用 Java 互操作来实例化它,但它提供了几个优点:
block-diagonal-matrix
从长远来看,给自己添加一个函数可能是有意义的core.matrix
。事实上,我刚刚创建了一个问题来执行此操作: