using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Azimuth; using Azimuth.DenseLinearAlgebra; namespace Azimuth.UnitTests.DenseLinearAlgebra { public class EigenDecompositionTests : UnitTestSharp.TestFixture { public class Symmetric_ValuesAndVectorsTests : UnitTestSharp.TestFixture { public void x00() { var matrix = new SquareMatrix(new Scalar[,] { }); var eigenVect = new SquareMatrix(new Scalar[,] { }); var eigenValues = new DenseVector(new Scalar[] { }); var eigenOut = new DenseVector(matrix.Size); EigenDecomposition.Symmetric_ValuesAndVectors(ref matrix, ref eigenOut); CheckEqual(eigenVect, matrix); CheckEqual(eigenValues, eigenOut); } public void x11() { var matrix = new SquareMatrix(new Scalar[,] { { 7, }, }); var eigenVect = new SquareMatrix(new Scalar[,] { { 1, }, }); var eigenValues = new DenseVector(new Scalar[] { 7, }); var eigenOut = new DenseVector(matrix.Size); EigenDecomposition.Symmetric_ValuesAndVectors(ref matrix, ref eigenOut); CheckEqual(eigenVect, matrix); CheckEqual(eigenValues, eigenOut); } public void x22() { var matrix = new SquareMatrix(new Scalar[,] { { 3, 4, }, { 4, 5, }, }); var eigenVect = new SquareMatrix(new Scalar[,] { { 0.788205438, 0.6154122094 }, { -0.6154122094, 0.788205438 }, }); var eigenValues = new DenseVector(new Scalar[] { -0.1231056256, 8.1231056256, }); var eigenOut = new DenseVector(matrix.Size); EigenDecomposition.Symmetric_ValuesAndVectors(ref matrix, ref eigenOut); CheckEqual(eigenVect, matrix); CheckEqual(eigenValues, eigenOut); } public void x33() { var matrix = new SquareMatrix(new Scalar[,] { { 3, 4, 5, }, { 4, 5, 6, }, { 5, 6, 7, }, }); var eigenVect = new SquareMatrix(new Scalar[,] { { -0.4082482905, 0.7890672012, 0.459027543, }, { 0.8164965809, 0.0907502288, 0.5701734204, }, { -0.4082482905, -0.6075667436, 0.6813192977, }, }); var eigenValues = new DenseVector(new Scalar[] { 0, -0.389866919, 15.389866919, }); var eigenOut = new DenseVector(matrix.Size); EigenDecomposition.Symmetric_ValuesAndVectors(ref matrix, ref eigenOut); CheckEqual(eigenVect, matrix); CheckEqual(eigenValues, eigenOut); } public void x44() { var matrix = new SquareMatrix(new Scalar[,] { { 103, 35, 17, 102, }, { 35, 25, 16, 48, }, { 17, 16, 21, 30, }, { 102, 48, 30, 136, }, }); var eigenVect = new SquareMatrix(new Scalar[,] { { 0.0614473413, -0.4773823994, 0.6312948626, 0.6081094189, }, { -0.8532270009, -0.2555135504, -0.3677288734, 0.2673798539, }, { 0.4954105655, -0.5693709871, -0.6355335481, 0.162733401, }, { 0.1509843728, 0.6185754193, -0.2496785559, 0.7295401213, }, }); var eigenValues = new DenseVector(new Scalar[] { 4.69534969286915, 9.84111567471034, 25.1571463752154, 245.306388257205, }); var eigenOut = new DenseVector(matrix.Size); EigenDecomposition.Symmetric_ValuesAndVectors(ref matrix, ref eigenOut); CheckEqual(eigenVect, matrix); CheckEqual(eigenValues, eigenOut); } public void x88() { var matrix = new SquareMatrix(new Scalar[,] { { 83, 60, 66, 41, 58, 18, 34, 66, }, { 60, 56, 41, 26, 47, 5, 16, 57, }, { 66, 41, 75, 28, 45, 22, 30, 46, }, { 41, 26, 28, 31, 25, 10, 24, 36, }, { 58, 47, 45, 25, 49, 8, 18, 50, }, { 18, 5, 22, 10, 8, 14, 12, 7, }, { 34, 16, 30, 24, 18, 12, 32, 29, }, { 66, 57, 46, 36, 50, 7, 29, 67, }, }); var eigenVect = new SquareMatrix(new Scalar[,] { { 0.2943904765, -0.0515118424, -0.5561629816, 0.4393305038, 0.3909599073, -0.0285421133, 0.0408949112, 0.5030064897 }, { 0.2817078867, 0.4408073139, -0.0472028527, -0.5926526675, -0.0029713138, -0.1465912748, -0.4575121126, 0.3768940452 }, { -0.37009385, 0.1860776369, -0.0476441202, -0.0632047993, -0.317381987, -0.5075716382, 0.5422679936, 0.4119781255 }, { -0.6026907965, 0.0885670729, 0.0044706558, -0.2630539157, 0.4705478915, 0.515489185, 0.09419473, 0.2523593922 }, { -0.0619585735, -0.7979575497, 0.2794346705, -0.1835837934, 0.0839740488, -0.2452171497, -0.2212151336, 0.362655364 }, { 0.4213316349, 0.1759507417, 0.651242277, 0.0283259231, 0.4227598833, -0.0411501249, 0.4193234816, 0.1017383646 }, { 0.3723628074, -0.2353545846, -0.1259529674, -0.2879714027, -0.4438502508, 0.5585093443, 0.389760238, 0.2152061906 }, { -0.1172859248, 0.1935968328, 0.4100003552, 0.5149042815, -0.3771130777, 0.2838675874, -0.3307592604, 0.4281831372 }, }); var eigenValues = new DenseVector(new Scalar[] { 3.7711905023349, 4.92623638141509, 2.24344173283778, 0.00729736534775971, 7.97126998533338, 26.9027690551553, 42.408802480854, 318.768992496722 }); var eigenOut = new DenseVector(matrix.Size); EigenDecomposition.Symmetric_ValuesAndVectors(ref matrix, ref eigenOut); CheckEqual(eigenVect, matrix); CheckEqual(eigenValues, eigenOut); } } } }