clojure - Clojure 中的 block 对角矩阵

标签 clojure clojure-contrib

我通过 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/

相关文章:

clojure - 从向量中选取 "Random"元素

java - 如何将环境变量附加到 java clojure cli?

clojure - 如何在命名空间的上下文中评估 clojure 数据结构?

用于一阶差分、二阶差分、...、n 阶差分的 Clojure 函数

http - 如何在 Clojure 中使用 POST 处理程序接收 edn? (以及如何发送)

file - 逐行读取大文件

clojure - 检测leiningen测试模式

clojure - 如何在 clojure 中从 stdin (*in*) 读取行

node.js - 使用 Aleph/Lamina 异步访问 MongoDB