You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:43:54