我正在尝试使用 PCA 找到 3d 点云的边界框。我正在使用 JAMA“Java Matrix Package”来执行 SVD。
我从我的点云中抽取 1000 个样本并执行 SVD:
Matrix pointsMatrix = new Matrix(nThPoints); SingularValueDecomposition svd = new SingularValueDecomposition(pointsMatrix);
我正在从结果中提取 3 个 PCA 向量并添加它们的负数:
双[] vector1 = {svd.getU().get(0, 0), svd.getU().get(1, 0), svd.getU().get(2, 0)}; 双[] vector1N = Vec.Mult(vector1, -1); double[] vector2 = {svd.getU().get(0, 1), svd.getU().get(1, 1), svd.getU().get(2, 1)}; double[] vector2N = Vec.Mult(vector2, -1); double[] vector3 = {svd.getU().get(0, 2), svd.getU().get(1, 2), svd.getU().get(2, 2)}; 双[] vector3N = Vec.Mult(vector3, -1);
我正在根据数据维度放大每个向量(遍历 1000 个点中的每一个并检查最大的投影是什么):
vector1 = Vec.projectData(vector1, nThPoints);
vector1N = Vec.projectData(vector1N, nThPoints); vector2 = Vec.projectData(vector2, nThPoints); vector2N = Vec.projectData(vector2N, nThPoints); vector3 = Vec.projectData(vector3, nThPoints); vector3N = Vec.projectData(vector3N, nThPoints);
现在,我有 6 个新向量,我需要以某种方式计算 8 个角(同时记住样本中心),我只是不知道该怎么做。
我怎样才能做到这一点?