如何在Eigen C++矩阵指定索引处插入行/列?
在Eigen中给矩阵指定位置插入全0行和列
嘿,刚好我之前折腾过Eigen的类似需求,它本身没有直接提供插入行/列的API,但用分块(block)操作完全可以搞定!针对你给出的例子,我给你写个完整的实现代码,一步步来:
核心思路
我们需要构造一个比原矩阵大一行一列的新矩阵,然后把原矩阵的各个部分“拼接”到新矩阵的对应位置,最后把要插入的行和列设为全0就行。注意Eigen默认是0-based索引,你说的“第2个索引”对应代码里的insert_idx = 2,刚好匹配你给出的示例效果。
完整代码示例
#include <Eigen/Dense> #include <iostream> int main() { // 初始化原矩阵A Eigen::MatrixXi A(3, 3); A << 1, 2, 3, 1, 2, 3, 1, 2, 3; std::cout << "原矩阵A:\n" << A << "\n\n"; // 指定插入位置(0-based索引) int insert_idx = 2; // 构造新矩阵B,行数和列数都比A多1 Eigen::MatrixXi B(A.rows() + 1, A.cols() + 1); // 填充新矩阵的四个区块 // 左上角:原矩阵前insert_idx行、前insert_idx列 B.block(0, 0, insert_idx, insert_idx) = A.block(0, 0, insert_idx, insert_idx); // 右上角:原矩阵前insert_idx行、从insert_idx列到末尾 B.block(0, insert_idx + 1, insert_idx, A.cols() - insert_idx) = A.block(0, insert_idx, insert_idx, A.cols() - insert_idx); // 左下角:原矩阵从insert_idx行到末尾、前insert_idx列 B.block(insert_idx + 1, 0, A.rows() - insert_idx, insert_idx) = A.block(insert_idx, 0, A.rows() - insert_idx, insert_idx); // 右下角:原矩阵从insert_idx行到末尾、从insert_idx列到末尾 B.block(insert_idx + 1, insert_idx + 1, A.rows() - insert_idx, A.cols() - insert_idx) = A.block(insert_idx, insert_idx, A.rows() - insert_idx, A.cols() - insert_idx); // 设置插入的行为全0 B.row(insert_idx).setZero(); // 设置插入的列为全0 B.col(insert_idx).setZero(); std::cout << "新矩阵B:\n" << B << "\n"; return 0; }
额外说明
- 这个方法适用于Eigen所有动态大小的矩阵类型,比如
MatrixXd(浮点型)、MatrixXi(整型)都没问题; - 如果需要插入多行多列,只需要调整新矩阵的大小(比如插入n行就
A.rows()+n),然后对应调整分块的起始位置和大小即可; - 记住Eigen的
block参数顺序是:起始行, 起始列, 行数, 列数,别搞混顺序哦!
内容的提问来源于stack exchange,提问作者Blurrrryy
相关产品推荐
相关产品推荐

