如何在C++中实现与Python等效的二维数组切片操作,提取faces对应顶点
实现方案
C++标准库的std::vector没有内置类似Python的切片语法,你可以通过自定义函数或者循环实现对应功能,也可以引入Eigen线性代数库获得更接近Python的简洁写法。
原生std::vector实现
通用封装函数
你可以封装一个通用函数,复用不同列的提取逻辑:
#include <vector> std::vector<std::vector<double>> slice_vertices_by_face_col( const std::vector<std::vector<double>>& vertices, const std::vector<std::vector<unsigned int>>& faces, int col_idx ) { std::vector<std::vector<double>> result; // 预分配空间,减少内存拷贝提升性能 result.reserve(faces.size()); for (const auto& face : faces) { unsigned int vertex_idx = face[col_idx]; // 可选:添加边界检查,避免索引越界 // if (vertex_idx >= vertices.size()) throw std::out_of_range("顶点索引越界"); result.push_back(vertices[vertex_idx]); } return result; }
调用示例
和Python的写法一一对应:
// 等效Python:v0 = vertices[faces[:,0],:] auto v0 = slice_vertices_by_face_col(vertices, faces, 0); // 等效Python:v1 = vertices[faces[:,1],:] auto v1 = slice_vertices_by_face_col(vertices, faces, 1); // 等效Python:v2 = vertices[faces[:,2],:] auto v2 = slice_vertices_by_face_col(vertices, faces, 2);
如果不需要复用逻辑,也可以直接写裸循环实现,以v0为例:
std::vector<std::vector<double>> v0; v0.reserve(faces.size()); for (const auto& face : faces) { v0.push_back(vertices[face[0]]); }
Eigen库实现(图形学场景常用)
如果你的项目允许引入第三方库,做三维网格处理常用的Eigen库支持和Python非常相似的切片语法,性能也远高于嵌套std::vector:
#include <Eigen/Dense> // 定义Eigen格式的顶点、面数组 Eigen::MatrixXd vertices; // 形状为 [顶点数, 3] Eigen::MatrixXi faces; // 形状为 [面数, 3] // 等效Python的切片写法 Eigen::MatrixXd v0 = vertices(faces.col(0), Eigen::all); Eigen::MatrixXd v1 = vertices(faces.col(1), Eigen::all); Eigen::MatrixXd v2 = vertices(faces.col(2), Eigen::all);
内容的提问来源于stack exchange,提问作者jack tsang
相关产品推荐
相关产品推荐

