PCA を使用して 3 次元点群の境界ボックスを見つけようとしています。SVDを実行するために、JAMA「Java Matrix Package」を使用しています。
ポイント クラウドから 1000 をサンプリングして SVD を実行しています。
Matrix pointsMatrix = new Matrix(nThPoints); SingularValueDecomposition svd = new SingularValueDecomposition(pointsMatrix);
結果から 3 つの PCA ベクトルを抽出し、それらのネガを追加しています。
double[] vector1 = {svd.getU().get(0, 0), svd.getU().get(1, 0), svd.getU().get(2, 0)}; double[] 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)}; double[] 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 つのコーナーを計算する必要があります (サンプルの中心を覚えている間) が、その方法がわかりません。
どうやってやるの?