/** * static int CENTER( ARMat *inout, ARVec *mean )の代替関数 * * @param inout * @param mean * @return */ private static void PCA_CENTER(NyARMat inout, NyARVec mean) { double[] v; int row, clm; row = inout.getRow(); clm = inout.getClm(); if (mean.getClm() != clm) { throw new NyARException(); } double[][] im = inout.m; double[] im_i; double w0, w1; v = mean.getArray(); // 特にパフォーマンスが劣化するclm=1と2ときだけ、別パスで処理します。 switch (clm) { case 1: w0 = v[0]; for (int i = 0; i < row; i++) { im[i][0] -= w0; } break; case 2: w0 = v[0]; w1 = v[1]; for (int i = 0; i < row; i++) { im_i = im[i]; im_i[0] -= w0; im_i[1] -= w1; } break; default: for (int i = 0; i < row; i++) { im_i = im[i]; for (int j = 0; j < clm; j++) { // *(m++) -= *(v++); im_i[j] -= v[j]; } } break; } return; }
/** * ARToolKitの、arMatrixUnit関数と同等な関数です。unitを単位行列に初期化します。 * この関数は未チェックの為、実行すると例外が発生します。 * @param unit * 操作するオブジェクト。 */ public static void matrixUnit(NyARMat unit) { if (unit.row != unit.clm) { throw new NyARException(); } NyARException.trap("未チェックのパス"); // For順変更禁止 for (int r = 0; r < unit.getRow(); r++) { for (int c = 0; c < unit.getClm(); c++) { if (r == c) { unit._m[r][c] = 1.0; } else { unit._m[r][c] = 0.0; } } } }