public float cofactor_zb(int ridx, int cidx)
        {
            int rowlen = this.RowLen;
            int collen = this.ColLen;

            if (rowlen < 2 || collen < 2)
            {
                throw new CtkException("The Length need > 1");
            }
            CtkMatrixf rs = new CtkMatrixf(rowlen - 1, collen - 1);


            int factor = (ridx + cidx) % 2 == 0 ? 1 : -1;

            for (int i = 0, i1 = 0; i < rowlen; i++)
            {
                if (i == ridx)
                {
                    continue;
                }

                for (int j = 0, j1 = 0; j < collen; j++)
                {
                    if (j == cidx)
                    {
                        continue;
                    }
                    rs.m_data[i1, j1] = this.m_data[i, j];
                    j1++;
                }
                i1++;
            }
            return(factor * rs.determinant());
        }
        public static CtkMatrixf operator /(float r, CtkMatrixf m)
        {
            CtkMatrixf rs = new CtkMatrixf(m);

            for (int i = 0; i < rs.RowLen; i++)
            {
                for (int j = 0; j < rs.ColLen; j++)
                {
                    rs.m_data[i, j] /= r;
                }
            }
            return(rs);
        }
        public CtkMatrixf adj()
        {
            CtkMatrixf rs = new CtkMatrixf(this.ColLen, this.RowLen);

            for (int i = 0; i < rs.RowLen; i++)
            {
                for (int j = 0; j < rs.ColLen; j++)
                {
                    rs.m_data[i, j] = this.cofactor_zb(j, i);
                }
            }
            return(rs);
        }
        public void set(CtkMatrixf matrix)
        {
            if (this.RowLen != matrix.RowLen ||
                this.ColLen != matrix.ColLen)
            {
                throw new CtkException("Different length of data");
            }

            for (int i = 0; i < matrix.RowLen; i++)
            {
                for (int j = 0; j < matrix.ColLen; j++)
                {
                    this.m_data[i, j] = matrix.m_data[i, j];
                }
            }
        }
        public static CtkMatrixf operator *(CtkMatrixf m1, CtkMatrixf m2)
        {
            CtkMatrixf rs = new CtkMatrixf(m1.RowLen, m1.ColLen);

            for (int i = 0; i < rs.RowLen; i++)
            {
                for (int j = 0; j < rs.ColLen; j++)
                {
                    rs.m_data[i, j] = 0;
                    for (int k = 0; k < rs.ColLen; k++)
                    {
                        rs.m_data[i, j] += m1.m_data[i, k] * m2.m_data[k, j];
                    }
                }
            }
            return(rs);
        }
        public CtkMatrixf rowOperateAddMultiple_zb(int rowi, int rowj, float factork)
        {
            CtkMatrixf rs = new CtkMatrixf(this.RowLen, this.ColLen);

            for (int colIdx = 0; colIdx < rs.ColLen; colIdx++)
            {
                rs.m_data[rowj, colIdx] = this.m_data[rowj, colIdx] + factork * this.m_data[rowi, colIdx];
            }

            for (int rowIdx = 0; rowIdx < rs.RowLen; rowIdx++)
            {
                if (rowIdx == rowj)
                {
                    continue;
                }
                for (int colIdx = 0; colIdx < rs.ColLen; colIdx++)
                {
                    rs.m_data[rowIdx, colIdx] = this.m_data[rowIdx, colIdx];
                }
            }
            return(rs);
        }
        public CtkMatrixf rowOperateExchange_zb(int rowi, int rowj)
        {
            CtkMatrixf rs = new CtkMatrixf(this.RowLen, this.ColLen);

            for (int colIdx = 0; colIdx < rs.ColLen; colIdx++)
            {
                rs.m_data[rowi, colIdx] = this.m_data[rowj, colIdx];
                rs.m_data[rowj, colIdx] = this.m_data[rowi, colIdx];
            }

            for (int rowIdx = 0; rowIdx < rs.RowLen; rowIdx++)
            {
                if (rowIdx == rowi || rowIdx == rowj)
                {
                    continue;
                }
                for (int colIdx = 0; colIdx < rs.ColLen; colIdx++)
                {
                    rs.m_data[rowIdx, colIdx] = this.m_data[rowIdx, colIdx];
                }
            }
            return(rs);
        }
 public CtkMatrixf(CtkMatrixf matrix)
 {
     this.m_data = new float[matrix.RowLen, matrix.ColLen]; this.set(matrix);
 }