コード例 #1
0
ファイル: NyARMat.cs プロジェクト: xiaoxinwt/NyARToolkitCS
        /**
         * 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;
        }
コード例 #2
0
ファイル: NyARMat.cs プロジェクト: xiaoxinwt/NyARToolkitCS
        /* 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;
        }
コード例 #3
0
 /**
  * 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;
             }
         }
     }
 }
コード例 #4
0
ファイル: NyARMat.cs プロジェクト: Carteor/LensesAR-Unity3D
 /**
  * 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;
             }
         }
     }
 }
コード例 #5
0
ファイル: NyARMat.cs プロジェクト: whztt07/NyARToolkitCS
        /**
         * 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;
        }
コード例 #6
0
ファイル: NyARMat.cs プロジェクト: whztt07/NyARToolkitCS
        /* 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;
        }