/// <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; } } } }
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]); } }
/// <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; } } }