Ejemplo n.º 1
0
        /// <summary>Initializes this Metric object from metric matrix (called by constructor) </summary>
        /// <param name="m">The NxN metric matrix</param>
        private void init(DotNetMatrix.GeneralMatrix m)
        {
            if (!Util.IsSymmetric(m))
            {
                throw new Exception("The metric matrix must be symmetric");
            }

            m_matrix = m.Copy();

//            System.Console.WriteLine("m_matrix: " + Util.ToString(m_matrix));

            // compute eigen value decomposition
            m_eig = new DotNetMatrix.EigenvalueDecomposition(m_matrix);

//            System.Console.WriteLine("m_eig: " + Util.ToString(m_eig.GetV()));

            m_invEigMatrix = m_eig.GetV().Transpose();

            m_eigenMetric = m_eig.RealEigenvalues;

//            {
//              DotNetMatrix.GeneralMatrix D = Util.Diagonal(m_eigenMetric);
//            DotNetMatrix.GeneralMatrix tmp = m_eig.GetV().Multiply(D).Multiply(m_invEigMatrix);
//                System.Console.WriteLine("input_matrix = " + Util.ToString(tmp));
            //      }

            m_isDiagonal = Util.IsDiagonal(m_matrix);
            if (!m_isDiagonal)
            {
                m_isEuclidean = m_isAntiEuclidean = false;
            }
            else
            {
                m_isEuclidean = m_isAntiEuclidean = true;
                for (int i = 0; i < m.RowDimension; i++)
                {
                    if (m_matrix.GetElement(i, i) != 1.0)
                    {
                        m_isEuclidean = false;
                    }
                    if (m_matrix.GetElement(i, i) != -1.0)
                    {
                        m_isAntiEuclidean = false;
                    }
                }
            }
        }
Ejemplo n.º 2
0
        private void UseGeneralMatrix(out Matrix eigenvals, out Matrix eigenvecs)
        {
            if (AllElementsReal == false)
                throw new Exception("All matrix elements must be real to diagonalize.");

            double[][] eles = new double[Rows][];
            for (int i = 0; i < Rows; i++)
                eles[i] = new double[Columns];

            for (int i = 0; i < Rows; i++)
            {
                for (int j = 0; j < Columns; j++)
                {
                    eles[i][j] = this[i, j].RealPart;
                }
            }

            GeneralMatrix matrix = new GeneralMatrix(eles);

            EigenvalueDecomposition evs = new EigenvalueDecomposition(matrix);

            GeneralMatrix vectors = evs.GetV();

            eigenvecs = new Matrix(Rows, Columns);

            for (int i = 0; i < Rows; i++)
            {
                for (int j = 0; j < Columns; j++)
                {
                    eigenvecs[i, j] = vectors.GetElement(i, j);
                }
            }

            double[] values = evs.RealEigenvalues;
            double[] valimag = evs.ImagEigenvalues;

            eigenvals = new Matrix(Rows, 1);

            for (int i = 0; i < Rows; i++)
            {
                eigenvals[i, 0] = new Complex(values[i], valimag[i]);
            }
        }
Ejemplo n.º 3
0
        /// <summary>Initializes this Metric object from metric matrix (called by constructor) </summary>
        /// <param name="m">The NxN metric matrix</param> 
        private void init(DotNetMatrix.GeneralMatrix m)
        {
            if (!Util.IsSymmetric(m))
                throw new Exception("The metric matrix must be symmetric");

            m_matrix = m.Copy();

            //            System.Console.WriteLine("m_matrix: " + Util.ToString(m_matrix));

            // compute eigen value decomposition
            m_eig = new DotNetMatrix.EigenvalueDecomposition(m_matrix);

            //            System.Console.WriteLine("m_eig: " + Util.ToString(m_eig.GetV()));

            m_invEigMatrix = m_eig.GetV().Transpose();

            m_eigenMetric = m_eig.RealEigenvalues;

            //            {
              //              DotNetMatrix.GeneralMatrix D = Util.Diagonal(m_eigenMetric);
            //            DotNetMatrix.GeneralMatrix tmp = m_eig.GetV().Multiply(D).Multiply(m_invEigMatrix);
            //                System.Console.WriteLine("input_matrix = " + Util.ToString(tmp));
              //      }

            m_isDiagonal = Util.IsDiagonal(m_matrix);
            if (!m_isDiagonal)
            {
                m_isEuclidean = m_isAntiEuclidean = false;
            }
            else
            {
                m_isEuclidean = m_isAntiEuclidean = true;
                for (int i = 0; i < m.RowDimension; i++)
                {
                    if (m_matrix.GetElement(i, i) != 1.0)
                        m_isEuclidean = false;
                    if (m_matrix.GetElement(i, i) != -1.0)
                        m_isAntiEuclidean = false;
                }
            }
        }