/// <summary> /// Create a non orthogonal frame based on an asymmetric inner product matrix /// </summary> /// <param name="ipm"></param> /// <returns></returns> private static GaFrameNonOrthogonal CreateNonOrthogonalFromIpm(MathematicaMatrix ipm) { MathematicaVector eigenValues; MathematicaMatrix eigenVectors; if (ipm.EigenSystem(MathematicaMatrix.EigenVectorsSpecs.OrthogonalInMatrixColumns, out eigenValues, out eigenVectors) == false) { throw new GMacSymbolicException("Cannot obtain orthogonal eigen system of the given matrix"); } var baseFrame = CreateOrthogonal(eigenValues); var baseToDerivedOm = GaOuterMorphismFull.Create(eigenVectors); var derivedToBaseOm = GaOuterMorphismFull.Create(eigenVectors.Transpose()); return(new GaFrameNonOrthogonal(baseFrame, ipm, derivedToBaseOm, baseToDerivedOm)); }