MATLAB中基于顶点索引快速裁剪3D三角剖分的优化问询
用containers.Map优化3D三角剖分裁剪性能
核心思路
用containers.Map构建原顶点索引→新连续索引的哈希映射,替代ismember的线性查找逻辑,大幅提升顶点存在性检查和索引转换的速度,解决性能瓶颈。
具体实现代码
假设你已有以下变量:
pt:原3D顶点坐标数组(1000×3)conn:原三角面连接矩阵(2000×3,每行是一个三角面的三个顶点索引)selected_verts:需要保留的顶点索引列表(示例中为92个)
基础循环版本(可读性优先)
% 1. 建立原索引到新索引的哈希映射 vert_map = containers.Map('KeyType', 'double', 'ValueType', 'double'); for idx = 1:length(selected_verts) vert_map(selected_verts(idx)) = idx; end % 2. 筛选有效三角面并转换索引 new_conn = []; for face_idx = 1:size(conn, 1) v1 = conn(face_idx, 1); v2 = conn(face_idx, 2); v3 = conn(face_idx, 3); % 快速检查三个顶点是否都在选中列表内 if isKey(vert_map, v1) && isKey(vert_map, v2) && isKey(vert_map, v3) % 替换为新的连续索引 new_face = [vert_map(v1), vert_map(v2), vert_map(v3)]; new_conn = [new_conn; new_face]; end end % 3. 提取裁剪后的顶点坐标 new_pt = pt(selected_verts, :);
向量化版本(性能优先)
如果觉得循环遍历面不够快,可以用向量化操作进一步提速:
% 1. 建立哈希映射 vert_map = containers.Map('KeyType', 'double', 'ValueType', 'double'); vert_map(selected_verts) = 1:length(selected_verts); % 2. 批量筛选并转换索引 conn_cell = num2cell(conn, 2); % 先标记所有三个顶点都在选中列表的面 valid_mask = cellfun(@(face) all(isKey(vert_map, face)), conn_cell); % 对有效面的顶点索引做批量转换 new_conn = cell2mat(cellfun(@(face) [vert_map{face(1)}, vert_map{face(2)}, vert_map{face(3)}], ... conn_cell(valid_mask), 'UniformOutput', false)); % 3. 提取裁剪后的顶点坐标 new_pt = pt(selected_verts, :);
性能优化说明
containers.Map的isKey和键值查找是O(1)的哈希表操作,对比ismember的O(n)线性查找,在顶点数量较大时速度提升非常明显。- 对于2000个面的规模,两种版本都能快速完成处理,循环版本可读性更强,向量化版本在面数更多时优势更突出。
内容的提问来源于stack exchange,提问作者Yoav Zack
相关产品推荐
相关产品推荐

