使用 Eigen 的 Map 类型时,我可以将行数据浅复制到 emb_look_up 吗? void func(Eigen::MatrixXf& global_matrix, Eigen::MatrixXf* hidden_vec, std::vector& row_idx) { Eigen::MatrixXf emb_look_up(32, 128); for (int i = 0; i < row_idx.size(); ++i) { emb_look_up.row(i) = global_matrix.row(row_idx[i]); } hidden_vec->noalias() = Eigen::Matrix::Ones() * emb_look_up; } row_idx 的值不连续

您不能准确地“映射”它,但 Eigen-3.4 可以使用索引向量作为表达式,如文档中所示。 void func(Eigen::MatrixXf& global_matrix, Eigen::MatrixXf* hidden_vec, std::vector& row_idx) { hidden_vec->noalias() = Eigen::RowVectorXf::Ones(row_idx.size()) * global_matrix(row_idx, Eigen::all); } 关于性能的注释:如果可以,存储你的global_matrix转置,然后获取每列的索引。由于 Eigen存储其矩阵列优先顺序,这确保了更多的矢量化机会和更好的缓存效率。

row_idx与中的行数大小相同吗global_matrix?

不,row_idx 大小可能是 10,global_matrix 行数可能是 10000

注意:(RowVector::Ones() * M本质上)与M.colwise().sum()