我通过 core.matrix 搜索 block 对角矩阵函数并搜索了 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]]。
最佳答案
首先,您需要一个函数来生成大小为 n 的向量,并将元素 m 注入(inject)到第 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 的结果(假设矩阵
是对角线元素的列表)
(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可以替换为矩阵。
关于clojure - Clojure 中的 block 对角矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20665038/