public void SolveGETest() { const int N = 50; var a = new SparseDoubleMatrix(N, N); for (int i = 0; i < N; i++) { a[i, i] = 1; } // Apply random rotations around each pair of axes. This will keep det(A) ~ 1 var rand = new Random(); for (int i = 0; i < N; i++) { for (int j = i + 1; j < N; j++) { double angle = rand.NextDouble() * 2 * Math.PI; var r = new SparseDoubleMatrix(N, N); for (int k = 0; k < N; k++) { r[k, k] = 1; } r[i, i] = r[j, j] = Math.Cos(angle); r[i, j] = Math.Sin(angle); r[j, i] = -Math.Sin(angle); a = a * r; } } var ainit = a.Clone(); // Generate random vector var b = new DoubleVector(N); for (int i = 0; i < N; i++) { b[i] = rand.NextDouble(); } var binit = b.Clone(); // Solve system var solver = new GaussianEliminationSolver(); var sw = new Stopwatch(); sw.Start(); var x = solver.SolveDestructive(a, b.GetInternalData()); sw.Stop(); Trace.WriteLine("Gaussian elimination took: " + sw.ElapsedTicks); // Put solution into system var b2 = ainit * x; // Verify result is the same Assert.IsTrue(VectorMath.LInfinityNorm(binit, b2) < 1e-6); }
public void Clone() { DoubleVector a = new DoubleVector(new double[4]{0,1,2,3}); DoubleVector b = a.Clone(); Assert.AreEqual(a[0],b[0]); Assert.AreEqual(a[1],b[1]); Assert.AreEqual(a[2],b[2]); Assert.AreEqual(a[3],b[3]); a=a*2; Assert.AreEqual(a[0],b[0]*2); Assert.AreEqual(a[1],b[1]*2); Assert.AreEqual(a[2],b[2]*2); Assert.AreEqual(a[3],b[3]*2); }