在一个大矩阵中创建子矩阵

creating sub-matrices inside a big one in Eigen Library

本文关键字:创建 一个      更新时间:2023-10-16

我想构造下面的矩阵

              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 Library中完成这个过程?我知道如何在本征中创建矩阵但我不知道如何将它们构建成一个矩阵。

查看Eigen中的高级初始化页面。我认为以下(未经测试的)代码构建了您想要的矩阵:

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
相关文章: