예제 #1
0
        /**
         * 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
 /**
  * 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;
             }
         }
     }
 }
예제 #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
        /**
         * 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;
        }