【问题标题】:creating sub-matrices inside a big one in Eigen Library在 Eigen 库中的大矩阵中创建子矩阵
【发布时间】:2014-08-06 20:03:52
【问题描述】:

我想构造如下矩阵

              A(3x3)              B(3x3N) 
    F     = [|1 0 0|  |0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0|;
(6x3+3N)     |0 1 0|  |0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0|;
             |0 0 1|  |0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0|;
             -------  -----------------------------------
             |0 0 0|  |0 0 0 1 0 0 0 0 0 0 0 0 ... 0 0 0|;
             |0 0 0|  |0 0 0 0 1 0 0 0 0 0 0 0 ... 0 0 0|;
             |0 0 0|  |0 0 0 0 0 1 0 0 0 0 0 0 ... 0 0 0|];
              C(3x3)              D(3x3N)

B & C 始终为零。 A 是一个单位矩阵。 D 很棘手。这些是基于索引指定的。例如,如果索引是0,那么D就是

                   |1 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0|;
                   |0 1 0 0 0 0 0 0 0 0 0 0 ... 0 0 0|;
                   |0 0 1 0 0 0 0 0 0 0 0 0 ... 0 0 0|;
                                D(3x3N)

如果索引是1,那么D

                   |0 0 0 1 0 0 0 0 0 0 0 0 ... 0 0 0|;
                   |0 0 0 0 1 0 0 0 0 0 0 0 ... 0 0 0|;
                   |0 0 0 0 0 1 0 0 0 0 0 0 ... 0 0 0|;
                                D(3x3N)

如何在 Eigen 库中完成这个过程?我知道如何在 Eigen 中创建矩阵,但我不知道如何将它们构造为一个矩阵。

【问题讨论】:

    标签: c++ matrix sparse-matrix eigen3


    【解决方案1】:

    查看 Eigen 中的 Advanced initialization 页面。我认为以下(未经测试的)代码构造了您想要的矩阵:

    MatrixXd F(6, 3 + 3 * N);  // you need to specify the size before doing F << ...
    F << MatrixXd::Identity(3, 3),   // matrix A
         MatrixXd::Zero(3, 3 * N),   // matrix B
         MatrixXd::Zero(3, 3 + 3 * index),   // matrix C plus left zero block in D
         MatrixXd::Identity(3, 3),   // indentity block in D
         MatrixXd::Zero(3, 3 * (N - index - 1));  // right zero block in D
    

    【讨论】:

    • 谢谢。即使我解决了它,你的方法似乎更具可读性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多