/** * 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; }
/* int arMatrixPCA2( ARMat *input, ARMat *evec, ARVec *ev ); */ public static void arMatrixPCA2(NyARMat input, NyARMat evec, NyARVec ev) { NyARException.trap("未チェックのパス"); NyARMat work; // double srow; // unreferenced double sum; int row, clm; int check; row = input.row; // row = input->row; clm = input.clm; // clm = input->clm; check = (row < clm) ? row : clm; if (row < 2 || clm < 2) { throw new NyARException(); } if (evec.getClm() != input.clm || evec.row != check) {// if( evec->clm!= input->clm|| evec->row!= check ){ throw new NyARException(); } if (ev.getClm() != check) {// if( ev->clm != check ){ throw new NyARException(); } NyARException.trap("未チェックのパス"); work = input.matrixAllocDup(); NyARException.trap("未チェックパス"); work.PCA_PCA(evec, ev);// rval = PCA( work, evec, ev ); sum = 0.0; double[] ev_array = ev.getArray(); for (int i = 0; i < ev.getClm(); i++) {// for( i = 0; i < ev->clm; i++ // ){ NyARException.trap("未チェックパス"); sum += ev_array[i];// sum += ev->v[i]; } for (int i = 0; i < ev.getClm(); i++) { // for(int i = 0; i < ev->clm;i++ ){ NyARException.trap("未チェックパス"); ev_array[i] /= sum; // ev->v[i] /= sum; } 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; } } } }
/* int arMatrixPCA2( ARMat *input, ARMat *evec, ARVec *ev ); */ public static void arMatrixPCA2(NyARMat input, NyARMat evec, NyARVec ev) { NyARException.trap("未チェックのパス"); NyARMat work; // double srow; // unreferenced double sum; int row, clm; int check; row = input.row;// row = input->row; clm = input.clm;// clm = input->clm; check = (row < clm) ? row : clm; if (row < 2 || clm < 2) { throw new NyARException(); } if (evec.getClm() != input.clm || evec.row != check) {// if( evec->clm!= input->clm|| evec->row!= check ){ throw new NyARException(); } if (ev.getClm() != check) {// if( ev->clm != check ){ throw new NyARException(); } NyARException.trap("未チェックのパス"); work = input.matrixAllocDup(); NyARException.trap("未チェックパス"); work.PCA_PCA(evec, ev);// rval = PCA( work, evec, ev ); sum = 0.0; double[] ev_array = ev.getArray(); for (int i = 0; i < ev.getClm(); i++) {// for( i = 0; i < ev->clm; i++ // ){ NyARException.trap("未チェックパス"); sum += ev_array[i];// sum += ev->v[i]; } for (int i = 0; i < ev.getClm(); i++) {// for(int i = 0; i < ev->clm;i++ ){ NyARException.trap("未チェックパス"); ev_array[i] /= sum;// ev->v[i] /= sum; } return; }