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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:15:08