如何基于3D浓度矩阵计算内部椭球的纵横比
3D浓度矩阵椭球纵横比计算方案
步骤1:提取0.5等值面的所有坐标点
你之前用的contour3返回的是三维等高线的分段数据,需要额外解析才能拿到完整的边界点集,推荐直接用isosurface函数提取完整的0.5等值面点集,操作更简单:
% 生成网格坐标,若你的矩阵对应实际物理间距,可将1替换为对应步长dx/dy/dz [x,y,z] = meshgrid(1:size(C,2), 1:size(C,1), 1:size(C,3)); % 提取取值为0.5的等值面 iso = isosurface(x,y,z,C,0.5); % 取出所有边界点的三维坐标,格式为[N,3],N为边界点总数量 points = iso.vertices;
步骤2:计算椭球三个主轴长度
椭球的主轴方向可以通过边界点的主成分分析(PCA)得到,主轴长度和对应特征值的平方根成正比:
% 点集去中心化,将坐标原点移到椭球中心 points_centered = points - mean(points, 1); % 计算点集的协方差矩阵 cov_mat = cov(points_centered); % 计算特征值和特征向量,eig默认返回升序排列的特征值 [eigen_vecs, eigen_vals] = eig(cov_mat); % 提取三个主轴的半轴长度,按从大到小排序 semi_axes = sqrt(diag(eigen_vals))'; semi_axes = sort(semi_axes, 'descend');
得到的semi_axes三个值分别对应椭球的半长轴、半中轴、半短轴长度。
步骤3:计算纵横比
3D椭球的纵横比有两种常用定义,按需选择即可:
- 通用3D纵横比:最长轴/最短轴,计算方式为
aspect_ratio = semi_axes(1)/semi_axes(3) - 若需要某投影面的2D纵横比,比如xy平面的纵横比,计算方式为
semi_axes(1)/semi_axes(2)
如果你的矩阵坐标对应实际物理尺度,只需要在第一步生成x/y/z网格时把单位步长替换为实际物理步长即可,纵横比本身是比例值,不受尺度缩放影响。
内容的提问来源于stack exchange,提问作者Sora
相关产品推荐
相关产品推荐

