public void pca(double[] i_v1, double[] i_v2, int i_number_of_point, NyARDoubleMatrix22 o_evec, double[] o_ev, double[] o_mean)
        {
            NyARMat input = this.__pca_input;// 次処理で初期化される。

            // pcaの準備
            input.realloc(i_number_of_point, 2);
            double[][] input_array = input.getArray();
            for (int i = 0; i < i_number_of_point; i++)
            {
                input_array[i][0] = i_v1[i];
                input_array[i][1] = i_v2[i];
            }
            // 主成分分析
            input.pca(this.__pca_evec, this.__pca_ev, this.__pca_mean);
            double[]   mean_array = this.__pca_mean.getArray();
            double[][] evec_array = this.__pca_evec.getArray();
            double[]   ev_array   = this.__pca_ev.getArray();
            o_evec.m00 = evec_array[0][0];
            o_evec.m01 = evec_array[0][1];
            o_evec.m10 = evec_array[1][0];
            o_evec.m11 = evec_array[1][1];
            o_ev[0]    = ev_array[0];
            o_ev[1]    = ev_array[1];
            o_mean[0]  = mean_array[0];
            o_mean[1]  = mean_array[1];
            return;
        }
        /**
         * arGetLine(int x_coord[], int y_coord[], int coord_num,int vertex[], double line[4][3], double v[4][2]) arGetLine2(int x_coord[], int y_coord[], int
         * coord_num,int vertex[], double line[4][3], double v[4][2], double *dist_factor) の2関数の合成品です。 マーカーのvertex,lineを計算して、結果をo_squareに保管します。
         * Optimize:STEP[424->391]
         *
         * @param i_cparam
         * @return
         * @throws NyARException
         */
        private bool getSquareLine(int[] i_mkvertex, int[] i_xcoord, int[] i_ycoord, NyARSquare o_square)
        {
            NyARLinear[] l_line = o_square.line;
            NyARVec      ev     = this.__getSquareLine_ev;   // matrixPCAの戻り値を受け取る
            NyARVec      mean   = this.__getSquareLine_mean; // matrixPCAの戻り値を受け取る

            double[] mean_array = mean.getArray();
            NyARCameraDistortionFactor dist_factor = this._dist_factor_ref;
            NyARMat input = this.__getSquareLine_input; // 次処理で初期化される。
            NyARMat evec  = this.__getSquareLine_evec;  // アウトパラメータを受け取るから初期化不要//new NyARMat(2,2);

            double[][] evec_array = evec.getArray();
            double     w1;
            int        st, ed, n, i;
            NyARLinear l_line_i, l_line_2;

            for (i = 0; i < 4; i++)
            {
                w1 = (double)(i_mkvertex[i + 1] - i_mkvertex[i] + 1) * 0.05 + 0.5;
                st = (int)(i_mkvertex[i] + w1);
                ed = (int)(i_mkvertex[i + 1] - w1);
                n  = ed - st + 1;
                if (n < 2)
                {
                    // nが2以下でmatrix.PCAを計算することはできないので、エラー
                    return(false);
                }
                // pcaの準備
                input.realloc(n, 2);
                // バッチ取得
                dist_factor.observ2IdealBatch(i_xcoord, i_ycoord, st, n, input.getArray());

                // 主成分分析
                input.matrixPCA(evec, ev, mean);
                l_line_i           = l_line[i];
                l_line_i.run       = evec_array[0][1];                                                // line[i][0] = evec->m[1];
                l_line_i.rise      = -evec_array[0][0];                                               // line[i][1] = -evec->m[0];
                l_line_i.intercept = -(l_line_i.run * mean_array[0] + l_line_i.rise * mean_array[1]); // line[i][2] = -(line[i][0]*mean->v[0] + line[i][1]*mean->v[1]);
            }

            NyARDoublePoint2d[] l_sqvertex = o_square.sqvertex;
            NyARIntPoint[]      l_imvertex = o_square.imvertex;
            for (i = 0; i < 4; i++)
            {
                l_line_i = l_line[i];
                l_line_2 = l_line[(i + 3) % 4];
                w1       = l_line_2.run * l_line_i.rise - l_line_i.run * l_line_2.rise;
                if (w1 == 0.0)
                {
                    return(false);
                }
                l_sqvertex[i].x = (l_line_2.rise * l_line_i.intercept - l_line_i.rise * l_line_2.intercept) / w1;
                l_sqvertex[i].y = (l_line_i.run * l_line_2.intercept - l_line_2.run * l_line_i.intercept) / w1;
                // 頂点インデクスから頂点座標を得て保存
                l_imvertex[i].x = i_xcoord[i_mkvertex[i]];
                l_imvertex[i].y = i_ycoord[i_mkvertex[i]];
            }
            return(true);
        }