1.奇异值分解
average_data = np.mean(data, axis=0) # 求均值
decentration_matrix = data - average_data # 去中心化
H = np.dot(decentration_matrix.T, decentration_matrix) # 求解协方差矩阵 H
eigenvectors, eigenvalues, eigenvectors_T = np.linalg.svd(H) # SVD求解,特征向量,特征值
2.求表面曲率
cloud = o3d.io.read_point_cloud("C:/Users/HP/Desktop/Open3D/pcl-learning/data/table_scene_lms400_downsampled.pcd")
kdtree = o3d.geometry.KDTreeFlann(cloud)
num_points = len(cloud.points)
points = np.asarray(cloud.points)
k, idx, _ = kdtree.search_radius_vector_3d(cloud.points[100], 0.03)
neighbors = points[idx, :]
data=neighbors
average_data = np.mean(data, axis=0) # 求均值
decentration_matrix = data - average_data # 去中心化
H = np.dot(decentration_matrix.T, decentration_matrix) # 求解协方差矩阵 H
eigenvectors, eigenvalues, eigenvectors_T = np.linalg.svd(H) # SVD求解特征值、特征向量
if 1:
sort = eigenvalues.argsort()[::-1] # 降序排列
eigenvalues = eigenvalues[sort] # 索引
w=eigenvalues
delt = np.divide(w[2], np.sum(w), out=np.zeros_like(w[2]), where=np.sum(w) != 0)
注:
np.divide() 将第一个数组中的数组元素除以第二个元素中的元素(所有情况均逐个元素发生)。 arr1和arr2必须具有相同的形状,并且arr2中的元素不能为零;否则会引发错误。
W_update=np.zeros_like(W):函数主要是想实现构造一个矩阵W_update,其维度与矩阵W一致,并为其初始化为全0;这个函数方便的构造了新矩阵,无需参数指定shape大小