public void MatrixLPU_4x4() { int N = 4; var r = new Random(); for (int i = 0; i < 1000; ++i) { var A = new WWMatrix(N, N, new double[] { r.Next(10), r.Next(10), r.Next(10), r.Next(10), r.Next(10), r.Next(10), r.Next(10), r.Next(10), r.Next(10), r.Next(10), r.Next(10), r.Next(10), r.Next(10), r.Next(10), r.Next(10), r.Next(10) }); WWMatrix P; WWMatrix L; WWMatrix U; var result = WWMatrix.LUdecompose2(A, out L, out P, out U); if (result == WWMatrix.ResultEnum.FailedToChoosePivot) { continue; } Assert.IsTrue(result == WWMatrix.ResultEnum.Success); // Lは下三角行列。 var Ltype = L.DetermineMatType(); Assert.IsTrue(0 != (Ltype & (ulong)WWMatrix.MatType.LowerTriangular)); // Uは上三角行列。 var Utype = U.DetermineMatType(); Assert.IsTrue(0 != (Utype & (ulong)WWMatrix.MatType.UpperTriangular)); A.Print("A"); L.Print("L"); U.Print("U"); P.Print("P"); // P * A = L * U var LU = WWMatrix.Mul(L, U); var PA = WWMatrix.Mul(P, A); Assert.IsTrue(WWMatrix.IsSame(PA, LU)); } }
public void MatrixLPU_3x3a() { int N = 3; var A = new WWMatrix(N, N, new double[] { 6, 4, 1, 3, 3, 2, 7, 7, 3 }); WWMatrix P; WWMatrix L; WWMatrix U; var result = WWMatrix.LUdecompose2(A, out L, out P, out U); Assert.IsTrue(result == WWMatrix.ResultEnum.Success); // Lは下三角行列。 var Ltype = L.DetermineMatType(); Assert.IsTrue(0 != (Ltype & (ulong)WWMatrix.MatType.LowerTriangular)); // Uは上三角行列。 var Utype = U.DetermineMatType(); Assert.IsTrue(0 != (Utype & (ulong)WWMatrix.MatType.UpperTriangular)); A.Print("A"); L.Print("L"); U.Print("U"); P.Print("P"); // P * A = L * U var LU = WWMatrix.Mul(L, U); var PA = WWMatrix.Mul(P, A); Assert.IsTrue(WWMatrix.IsSame(PA, LU)); }