예제 #1
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 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;
                    }
                }
            }
        }
예제 #2
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;
                    }
                }
            }
        }