internal static ComplexNumber[] DiagonalShoArrayToArray(ComplexArray shoArray) { ComplexNumber[,] asMatrix = ShoArrayToArray(shoArray); ComplexNumber[] result = new ComplexNumber[shoArray.Size()[0]]; for (int i = 0; i < result.Length; i++) { result[i] = asMatrix[i, i]; } return(result); }
//public static double[][] MatrixExpViaEigenDecomp2(double[][] squareMatrix) //{ // DoubleArray matrix = new DoubleArray(squareMatrix); // Eigen eigenSystem = new Eigen(matrix); // ComplexArray exponentiatedDiagonal = ExpOfDiagComplex(eigenSystem.D); // ComplexArray result = eigenSystem.V * exponentiatedDiagonal * eigenSystem.V.Inv(); // return ShoArrayToRaggedArray(result); //} private static ComplexArray ExpOfDiagComplex(ComplexArray complexArray) { double[,] real = new double[complexArray.Size()[0], complexArray.Size()[1]]; double[,] img = new double[complexArray.Size()[0], complexArray.Size()[1]]; complexArray.ToArray(ref real, ref img); for (int i = 0; i < real.GetLength(0); i++) { real[i, i] = Math.Exp(real[i, i]); SpecialFunctions.SpecialFunctions.CheckCondition(img[i, i] == 0, "We can't deal with an imaginary number here."); } return(new ComplexArray(real, img)); }
internal static ComplexNumber[,] ShoArrayToArray(ComplexArray shoComplexArray) { double[,] real = new double[shoComplexArray.Size()[0], shoComplexArray.Size()[1]]; double[,] img = new double[shoComplexArray.Size()[0], shoComplexArray.Size()[1]]; shoComplexArray.ToArray(ref real, ref img); ComplexNumber[,] result = new ComplexNumber[real.GetLength(0), real.GetLength(1)]; for (int i = 0; i < result.GetLength(0); i++) { for (int j = 0; j < result.GetLength(1); j++) { result[i, j] = new ComplexNumber(real[i, j], img[i, j]); } } return(result); }