我查看了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]]。
答案 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
函数可能是有意义的。事实上,我刚刚创建了一个问题: