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

如何在C++ Eigen Array中选取指定行列索引的元素?

在Eigen Array中按行/列索引列表选取特定元素

需求说明

给定Eigen Array和对应的行、列索引列表,要选取每个行索引与对应列索引位置的元素,比如示例中取主对角线元素得到[1, 5, 9]。

你之前尝试的array(indices, indices)写法不符合预期,因为Eigen中这种方式会取所有行索引和列索引的笛卡尔积,最终得到一个和原矩阵维度一致的子矩阵,而非逐个对应位置的元素。

可行实现方式

方式1:用Eigen向量做逐元素索引

Eigen支持用VectorXi类型的向量作为索引,直接提取对应位置的元素:

#include <Eigen/Dense>
#include <vector>

int main() {
    Eigen::ArrayXXi array(3,3);
    array << 1,2,3,
             4,5,6,
             7,8,9;

    std::vector<int> row_indices = {0,1,2};
    std::vector<int> col_indices = {0,1,2};

    // 将std::vector转换为Eigen的VectorXi
    Eigen::VectorXi rows = Eigen::Map<Eigen::VectorXi, Eigen::Unaligned>(row_indices.data(), row_indices.size());
    Eigen::VectorXi cols = Eigen::Map<Eigen::VectorXi, Eigen::Unaligned>(col_indices.data(), col_indices.size());

    // 逐个选取(rows[i], cols[i])位置的元素,返回列向量
    Eigen::ArrayXi result = array(rows, cols);
    // 若需要行向量,可调用.transpose()转换
    // Eigen::ArrayXi result_row = array(rows, cols).transpose();

    // 输出结果:1 5 9
    std::cout << result << std::endl;
    return 0;
}

当rows和cols长度相同时,array(rows, cols)会精准匹配每个索引对,返回对应元素组成的列向量。

方式2:手动遍历索引(适合简单场景)

如果不想依赖Eigen的向量索引特性,也可以直接循环提取元素:

#include <Eigen/Dense>
#include <vector>
#include <iostream>

int main() {
    Eigen::ArrayXXi array(3,3);
    array << 1,2,3,
             4,5,6,
             7,8,9;

    std::vector<int> row_indices = {0,1,2};
    std::vector<int> col_indices = {0,1,2};
    Eigen::ArrayXi result(row_indices.size());

    for (size_t i = 0; i < row_indices.size(); ++i) {
        result(i) = array(row_indices[i], col_indices[i]);
    }

    std::cout << result << std::endl;
    return 0;
}

原代码失效原因

当传入两个std::vector给array()时,Eigen会将它们视为整行/整列的索引集合,即提取所有行索引对应的行、所有列索引对应的列,最终得到一个rows.size() × cols.size()的子矩阵,而非逐个匹配的元素。你的示例中会返回原矩阵,因为取了所有行和所有列。

内容的提问来源于stack exchange,提问作者Erik Nouroyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:01:16