如何在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
相关产品推荐
相关产品推荐

