/** * ARToolKitのPCA関数と同等な関数です。 * 詳細は不明です。 * @param output * 不明 * @param o_ev * 不明 * @ */ private void PCA_PCA(NyARMat o_output, NyARVec o_ev) { int l_row, l_clm, min; double[] ev_array = o_ev.getArray(); l_row = this.row;// row = input->row; l_clm = this.clm;// clm = input->clm; min = (l_clm < l_row) ? l_clm : l_row; if (l_row < 2 || l_clm < 2) { throw new NyARException(); } if (o_output.clm != this.clm) {// if( output->clm != input->clm ){ throw new NyARException(); } if (o_output.row != min) {// if( output->row != min ){ throw new NyARException(); } if (o_ev.getClm() != min) {// if( ev->clm != min ){ throw new NyARException(); } NyARMatPca u;// u =new NyARMat( min, min ); if (this.wk_PCA_PCA_u == null) { u = new NyARMatPca(min, min); this.wk_PCA_PCA_u = u; } else { u = this.wk_PCA_PCA_u; u.realloc(min, min); } if (l_row < l_clm) { NyARException.trap("未チェックのパス"); PCA_x_by_xt(this, u);// if(x_by_xt( input, u ) < 0 ) { } else { PCA_xt_by_x(this, u);// if(xt_by_x( input, u ) < 0 ) { } u.PCA_QRM(o_ev); double[][] m1, m2; if (l_row < l_clm) { NyARException.trap("未チェックのパス"); PCA_EV_create(this, u, o_output, o_ev); } else { m1 = u._m;// m1 = u->m; m2 = o_output._m;// m2 = output->m; int i; for (i = 0; i < min; i++) { if (ev_array[i] < PCA_VZERO) {// if( ev->v[i] < VZERO ){ break; } for (int j = 0; j < min; j++) { m2[i][j] = m1[i][j];// *(m2++) = *(m1++); } } for (; i < min; i++) {// for( ; i < min; i++){ // コードを見た限りあってそうだからコメントアウト(2008/03/26)NyARException.trap("未チェックのパス"); ev_array[i] = 0.0;// ev->v[i] = 0.0; for (int j = 0; j < min; j++) { m2[i][j] = 0.0;// *(m2++) = 0.0; } } } }
/** * ARToolKitのPCA関数と同等な関数です。 * 詳細は不明です。 * @param output * 不明 * @param o_ev * 不明 * @ */ private void PCA_PCA(NyARMat o_output, NyARVec o_ev) { int l_row, l_clm, min; double[] ev_array = o_ev.getArray(); l_row = this.row; // row = input->row; l_clm = this.clm; // clm = input->clm; min = (l_clm < l_row) ? l_clm : l_row; if (l_row < 2 || l_clm < 2) { throw new NyARRuntimeException(); } if (o_output.clm != this.clm) {// if( output->clm != input->clm ){ throw new NyARRuntimeException(); } if (o_output.row != min) {// if( output->row != min ){ throw new NyARRuntimeException(); } if (o_ev.getClm() != min) {// if( ev->clm != min ){ throw new NyARRuntimeException(); } NyARMatPca u;// u =new NyARMat( min, min ); if (this.wk_PCA_PCA_u == null) { u = new NyARMatPca(min, min); this.wk_PCA_PCA_u = u; } else { u = this.wk_PCA_PCA_u; u.realloc(min, min); } if (l_row < l_clm) { NyARRuntimeException.trap("未チェックのパス"); PCA_x_by_xt(this, u);// if(x_by_xt( input, u ) < 0 ) { } else { PCA_xt_by_x(this, u);// if(xt_by_x( input, u ) < 0 ) { } u.PCA_QRM(o_ev); double[][] m1, m2; if (l_row < l_clm) { NyARRuntimeException.trap("未チェックのパス"); PCA_EV_create(this, u, o_output, o_ev); } else { m1 = u._m; // m1 = u->m; m2 = o_output._m; // m2 = output->m; int i; for (i = 0; i < min; i++) { if (ev_array[i] < PCA_VZERO) {// if( ev->v[i] < VZERO ){ break; } for (int j = 0; j < min; j++) { m2[i][j] = m1[i][j];// *(m2++) = *(m1++); } } for (; i < min; i++) { // for( ; i < min; i++){ // コードを見た限りあってそうだからコメントアウト(2008/03/26)NyARException.trap("未チェックのパス"); ev_array[i] = 0.0; // ev->v[i] = 0.0; for (int j = 0; j < min; j++) { m2[i][j] = 0.0;// *(m2++) = 0.0; } } } }