From d4ff406a3d79b53a39c904e9d32a323a080e985a Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Thu, 4 Apr 2013 00:45:38 +0200 Subject: [PATCH] Tests: cosmetics, increase timeout for slow CI agent VM --- .../Complex/LinearAlgebraProviderTests.cs | 400 +-- .../Complex32/LinearAlgebraProviderTests.cs | 406 +-- .../Double/LinearAlgebraProviderTests.cs | 2766 +++++++++-------- .../Single/LinearAlgebraProviderTests.cs | 406 +-- 4 files changed, 1997 insertions(+), 1981 deletions(-) diff --git a/src/UnitTests/LinearAlgebraProviderTests/Complex/LinearAlgebraProviderTests.cs b/src/UnitTests/LinearAlgebraProviderTests/Complex/LinearAlgebraProviderTests.cs index 0ddbdaa1..678bee80 100644 --- a/src/UnitTests/LinearAlgebraProviderTests/Complex/LinearAlgebraProviderTests.cs +++ b/src/UnitTests/LinearAlgebraProviderTests/Complex/LinearAlgebraProviderTests.cs @@ -3,7 +3,9 @@ // http://numerics.mathdotnet.com // http://github.com/mathnet/mathnet-numerics // http://mathnetnumerics.codeplex.com -// Copyright (c) 2009-2010 Math.NET +// +// Copyright (c) 2009-2013 Math.NET +// // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without @@ -12,8 +14,10 @@ // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -45,30 +49,30 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex /// /// The Y Complex test vector. /// - private readonly Complex[] _y = new[] { new Complex(1.1, 0), 2.2, 3.3, 4.4, 5.5 }; + readonly Complex[] _y = new[] {new Complex(1.1, 0), 2.2, 3.3, 4.4, 5.5}; /// /// The X Complex test vector. /// - private readonly Complex[] _x = new[] { new Complex(6.6, 0), 7.7, 8.8, 9.9, 10.1 }; + readonly Complex[] _x = new[] {new Complex(6.6, 0), 7.7, 8.8, 9.9, 10.1}; - private static readonly IContinuousDistribution Dist = new Normal(); + static readonly IContinuousDistribution Dist = new Normal(); /// /// Test matrix to use. /// readonly IDictionary _matrices = new Dictionary - { - { "Singular3x3", new DenseMatrix(new[,] { { new Complex(1.0, 0), 1.0, 2.0 }, { 1.0, 1.0, 2.0 }, { 1.0, 1.0, 2.0 } }) }, - { "Square3x3", new DenseMatrix(new[,] { { new Complex(-1.1, 0), -2.2, -3.3 }, { 0.0, 1.1, 2.2 }, { -4.4, 5.5, 6.6 } }) }, - { "Square4x4", new DenseMatrix(new[,] { { new Complex(-1.1, 0), -2.2, -3.3, -4.4 }, { 0.0, 1.1, 2.2, 3.3 }, { 1.0, 2.1, 6.2, 4.3 }, { -4.4, 5.5, 6.6, -7.7 } }) }, - { "Singular4x4", new DenseMatrix(new[,] { { new Complex(-1.1, 0), -2.2, -3.3, -4.4 }, { -1.1, -2.2, -3.3, -4.4 }, { -1.1, -2.2, -3.3, -4.4 }, { -1.1, -2.2, -3.3, -4.4 } }) }, - { "Tall3x2", new DenseMatrix(new[,] { { new Complex(-1.1, 0), -2.2 }, { 0.0, 1.1 }, { -4.4, 5.5 } }) }, - { "Wide2x3", new DenseMatrix(new[,] { { new Complex(-1.1, 0), -2.2, -3.3 }, { 0.0, 1.1, 2.2 } }) }, - { "Tall50000x10", DenseMatrix.CreateRandom(50000, 10, Dist) }, - { "Wide10x50000", DenseMatrix.CreateRandom(10, 50000, Dist) }, - { "Square1000x1000", DenseMatrix.CreateRandom(1000, 1000, Dist) } - }; + { + {"Singular3x3", new DenseMatrix(new[,] {{new Complex(1.0, 0), 1.0, 2.0}, {1.0, 1.0, 2.0}, {1.0, 1.0, 2.0}})}, + {"Square3x3", new DenseMatrix(new[,] {{new Complex(-1.1, 0), -2.2, -3.3}, {0.0, 1.1, 2.2}, {-4.4, 5.5, 6.6}})}, + {"Square4x4", new DenseMatrix(new[,] {{new Complex(-1.1, 0), -2.2, -3.3, -4.4}, {0.0, 1.1, 2.2, 3.3}, {1.0, 2.1, 6.2, 4.3}, {-4.4, 5.5, 6.6, -7.7}})}, + {"Singular4x4", new DenseMatrix(new[,] {{new Complex(-1.1, 0), -2.2, -3.3, -4.4}, {-1.1, -2.2, -3.3, -4.4}, {-1.1, -2.2, -3.3, -4.4}, {-1.1, -2.2, -3.3, -4.4}})}, + {"Tall3x2", new DenseMatrix(new[,] {{new Complex(-1.1, 0), -2.2}, {0.0, 1.1}, {-4.4, 5.5}})}, + {"Wide2x3", new DenseMatrix(new[,] {{new Complex(-1.1, 0), -2.2, -3.3}, {0.0, 1.1, 2.2}})}, + {"Tall50000x10", DenseMatrix.CreateRandom(50000, 10, Dist)}, + {"Wide10x50000", DenseMatrix.CreateRandom(10, 50000, Dist)}, + {"Square1000x1000", DenseMatrix.CreateRandom(1000, 1000, Dist)} + }; /// /// Can add a vector to scaled vector @@ -95,7 +99,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex Control.LinearAlgebraProvider.AddVectorToScaledVector(result, Math.PI, _x, result); for (var i = 0; i < _y.Length; i++) { - Assert.AreEqual(_y[i] + (Math.PI * _x[i]), result[i]); + Assert.AreEqual(_y[i] + (Math.PI*_x[i]), result[i]); } } @@ -117,7 +121,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex Control.LinearAlgebraProvider.ScaleArray(Math.PI, result, result); for (var i = 0; i < _y.Length; i++) { - Assert.AreEqual(_y[i] * Math.PI, result[i]); + Assert.AreEqual(_y[i]*Math.PI, result[i]); } } @@ -169,7 +173,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex Control.LinearAlgebraProvider.PointWiseMultiplyArrays(_x, _y, result); for (var i = 0; i < result.Length; i++) { - Assert.AreEqual(_x[i] * _y[i], result[i]); + Assert.AreEqual(_x[i]*_y[i], result[i]); } } @@ -183,7 +187,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex Control.LinearAlgebraProvider.PointWiseDivideArrays(_x, _y, result); for (var i = 0; i < result.Length; i++) { - Assert.AreEqual(_x[i] / _y[i], result[i]); + Assert.AreEqual(_x[i]/_y[i], result[i]); } } @@ -275,7 +279,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 15); + AssertHelpers.AlmostEqual(x.Row(i)*y.Column(j), c[i, j], 15); } } } @@ -296,7 +300,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 15); + AssertHelpers.AlmostEqual(x.Row(i)*y.Column(j), c[i, j], 15); } } } @@ -317,7 +321,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 15); + AssertHelpers.AlmostEqual(x.Row(i)*y.Column(j), c[i, j], 15); } } } @@ -338,7 +342,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(2.2 * x.Row(i) * y.Column(j), c[i, j], 15); + AssertHelpers.AlmostEqual(2.2*x.Row(i)*y.Column(j), c[i, j], 15); } } } @@ -359,7 +363,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(2.2 * x.Row(i) * y.Column(j), c[i, j], 15); + AssertHelpers.AlmostEqual(2.2*x.Row(i)*y.Column(j), c[i, j], 15); } } } @@ -380,7 +384,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(2.2 * x.Row(i) * y.Column(j), c[i, j], 15); + AssertHelpers.AlmostEqual(2.2*x.Row(i)*y.Column(j), c[i, j], 15); } } } @@ -392,7 +396,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeLuFactor() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.RowCount]; + var a = new Complex[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var ipiv = new int[matrix.RowCount]; @@ -420,7 +424,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeLuInverse() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.RowCount]; + var a = new Complex[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); Control.LinearAlgebraProvider.LUInverse(a, matrix.RowCount); @@ -444,7 +448,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeLuInverseOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.RowCount]; + var a = new Complex[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var ipiv = new int[matrix.RowCount]; @@ -471,7 +475,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeLuInverseWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.RowCount]; + var a = new Complex[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var work = new Complex[matrix.RowCount]; @@ -496,7 +500,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeLuInverseOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.RowCount]; + var a = new Complex[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var ipiv = new int[matrix.RowCount]; @@ -524,10 +528,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingLU() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.RowCount]; + var a = new Complex[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; Control.LinearAlgebraProvider.LUSolve(2, a, matrix.RowCount, b); AssertHelpers.AlmostEqual(b[0], -1.477272727272726, 14); @@ -547,13 +551,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingLUOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.RowCount]; + var a = new Complex[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var ipiv = new int[matrix.RowCount]; Control.LinearAlgebraProvider.LUFactor(a, matrix.RowCount, ipiv); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; Control.LinearAlgebraProvider.LUSolveFactored(2, a, matrix.RowCount, ipiv, b); AssertHelpers.AlmostEqual(b[0], -1.477272727272726, 14); @@ -570,7 +574,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex [Test] public void CanComputeCholeskyFactor() { - var matrix = new Complex[] { 1, 1, 1, 1, 1, 5, 5, 5, 1, 5, 14, 14, 1, 5, 14, 15 }; + var matrix = new Complex[] {1, 1, 1, 1, 1, 5, 5, 5, 1, 5, 14, 14, 1, 5, 14, 15}; Control.LinearAlgebraProvider.CholeskyFactor(matrix, 4); Assert.AreEqual(matrix[0].Real, 1); Assert.AreEqual(matrix[1].Real, 1); @@ -596,10 +600,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex [Test] public void CanSolveUsingCholesky() { - var matrix = new DenseMatrix(3, 3, new Complex[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 }); - var a = new Complex[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 }; + var matrix = new DenseMatrix(3, 3, new Complex[] {1, 1, 1, 1, 2, 3, 1, 3, 6}); + var a = new Complex[] {1, 1, 1, 1, 2, 3, 1, 3, 6}; - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; Control.LinearAlgebraProvider.CholeskySolve(a, 3, b, 2); AssertHelpers.AlmostEqual(b[0], 0, 14); @@ -618,11 +622,11 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex [Test] public void CanSolveUsingCholeskyOnFactoredMatrix() { - var a = new Complex[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 }; + var a = new Complex[] {1, 1, 1, 1, 2, 3, 1, 3, 6}; Control.LinearAlgebraProvider.CholeskyFactor(a, 3); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; Control.LinearAlgebraProvider.CholeskySolveFactored(a, 3, b, 2); AssertHelpers.AlmostEqual(b[0], 0, 14); @@ -640,16 +644,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeQRFactorSquareMatrix() { var matrix = _matrices["Square3x3"]; - var r = new Complex[matrix.RowCount * matrix.ColumnCount]; + var r = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new Complex[3]; - var q = new Complex[matrix.RowCount * matrix.RowCount]; + var q = new Complex[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -667,16 +671,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeQRFactorTallMatrix() { var matrix = _matrices["Tall3x2"]; - var r = new Complex[matrix.RowCount * matrix.ColumnCount]; + var r = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new Complex[3]; - var q = new Complex[matrix.RowCount * matrix.RowCount]; + var q = new Complex[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -694,16 +698,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeQRFactorWideMatrix() { var matrix = _matrices["Wide2x3"]; - var r = new Complex[matrix.RowCount * matrix.ColumnCount]; + var r = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new Complex[3]; - var q = new Complex[matrix.RowCount * matrix.RowCount]; + var q = new Complex[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -721,17 +725,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeQRFactorSquareMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var r = new Complex[matrix.RowCount * matrix.ColumnCount]; + var r = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new Complex[3]; - var q = new Complex[matrix.RowCount * matrix.RowCount]; - var work = new Complex[matrix.ColumnCount * Control.BlockSize]; + var q = new Complex[matrix.RowCount*matrix.RowCount]; + var work = new Complex[matrix.ColumnCount*Control.BlockSize]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -749,17 +753,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeQRFactorTallMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var r = new Complex[matrix.RowCount * matrix.ColumnCount]; + var r = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new Complex[3]; - var q = new Complex[matrix.RowCount * matrix.RowCount]; - var work = new Complex[matrix.ColumnCount * Control.BlockSize]; + var q = new Complex[matrix.RowCount*matrix.RowCount]; + var work = new Complex[matrix.ColumnCount*Control.BlockSize]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -777,17 +781,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeQRFactorWideMatrixWithWorkArray() { var matrix = _matrices["Wide2x3"]; - var r = new Complex[matrix.RowCount * matrix.ColumnCount]; + var r = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new Complex[3]; - var q = new Complex[matrix.RowCount * matrix.RowCount]; - var work = new Complex[matrix.ColumnCount * Control.BlockSize]; + var q = new Complex[matrix.RowCount*matrix.RowCount]; + var work = new Complex[matrix.ColumnCount*Control.BlockSize]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -805,16 +809,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeThinQRFactorSquareMatrix() { var matrix = _matrices["Square3x3"]; - var r = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex[matrix.ColumnCount*matrix.ColumnCount]; var tau = new Complex[3]; - var q = new Complex[matrix.RowCount * matrix.ColumnCount]; + var q = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, q, q.Length); Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau); var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -832,16 +836,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeThinQRFactorTallMatrix() { var matrix = _matrices["Tall3x2"]; - var r = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex[matrix.ColumnCount*matrix.ColumnCount]; var tau = new Complex[3]; - var q = new Complex[matrix.RowCount * matrix.ColumnCount]; + var q = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, q, q.Length); Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau); var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -859,17 +863,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeThinQRFactorSquareMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var r = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex[matrix.ColumnCount*matrix.ColumnCount]; var tau = new Complex[3]; - var q = new Complex[matrix.RowCount * matrix.ColumnCount]; + var q = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, q, q.Length); - var work = new Complex[matrix.RowCount * matrix.ColumnCount]; + var work = new Complex[matrix.RowCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau, work); var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -887,17 +891,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeThinQRFactorTallMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var r = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex[matrix.ColumnCount*matrix.ColumnCount]; var tau = new Complex[3]; - var q = new Complex[matrix.RowCount * matrix.ColumnCount]; + var q = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, q, q.Length); - var work = new Complex[matrix.RowCount * matrix.ColumnCount]; + var work = new Complex[matrix.RowCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau, work); var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { for (var col = 0; col < matrix.ColumnCount; col++) @@ -914,17 +918,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingQRSquareMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); @@ -940,17 +944,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingQRTallMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); @@ -966,18 +970,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingQRSquareMatrixUsingWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; - var work = new Complex[matrix.RowCount * matrix.RowCount]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; + var work = new Complex[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); @@ -995,18 +999,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingQRTallMatrixUsingWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; - var work = new Complex[matrix.RowCount * matrix.RowCount]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; + var work = new Complex[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); @@ -1022,19 +1026,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingQRSquareMatrixOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.RowCount]; + var a = new Complex[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex[matrix.ColumnCount]; - var q = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var q = new Complex[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); @@ -1052,19 +1056,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingQRTallMatrixOnFactoredMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex[matrix.ColumnCount]; - var q = new Complex[matrix.RowCount * matrix.RowCount]; + var q = new Complex[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); @@ -1080,20 +1084,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingQRSquareMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.RowCount]; + var a = new Complex[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex[matrix.ColumnCount]; - var q = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var q = new Complex[matrix.ColumnCount*matrix.ColumnCount]; var work = new Complex[2048]; Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau, work); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); @@ -1111,20 +1115,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingQRTallMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex[matrix.ColumnCount]; - var q = new Complex[matrix.RowCount * matrix.RowCount]; + var q = new Complex[matrix.RowCount*matrix.RowCount]; var work = new Complex[2048]; Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau, work); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); @@ -1139,17 +1143,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingThinQRSquareMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, QRMethod.Thin); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); @@ -1166,17 +1170,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingThinQRTallMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, QRMethod.Thin); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); @@ -1192,18 +1196,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingThinQRSquareMatrixUsingWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; - var work = new Complex[matrix.RowCount * matrix.ColumnCount]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; + var work = new Complex[matrix.RowCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work, QRMethod.Thin); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); @@ -1221,18 +1225,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingThinQRTallMatrixUsingWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; - var work = new Complex[matrix.RowCount * matrix.ColumnCount]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; + var work = new Complex[matrix.RowCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work, QRMethod.Thin); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); @@ -1248,19 +1252,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingThinQRSquareMatrixOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex[matrix.ColumnCount]; - var r = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, QRMethod.Thin); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); @@ -1278,19 +1282,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingThinQRTallMatrixOnFactoredMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex[matrix.ColumnCount]; - var r = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, QRMethod.Thin); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); @@ -1306,20 +1310,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingThinQRSquareMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex[matrix.ColumnCount]; - var r = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex[matrix.ColumnCount*matrix.ColumnCount]; var work = new Complex[2048]; Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau, work); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work, QRMethod.Thin); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); @@ -1337,20 +1341,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingThinQRTallMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex[matrix.ColumnCount]; - var r = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex[matrix.ColumnCount*matrix.ColumnCount]; var work = new Complex[2048]; Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau, work); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work, QRMethod.Thin); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); @@ -1365,12 +1369,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeSVDFactorizationOfSquareMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex[matrix.RowCount]; - var u = new Complex[matrix.RowCount * matrix.RowCount]; - var vt = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex[matrix.RowCount*matrix.RowCount]; + var vt = new Complex[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); @@ -1382,7 +1386,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); @@ -1402,12 +1406,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeSVDFactorizationOfTallMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex[matrix.ColumnCount]; - var u = new Complex[matrix.RowCount * matrix.RowCount]; - var vt = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex[matrix.RowCount*matrix.RowCount]; + var vt = new Complex[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); @@ -1419,7 +1423,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); @@ -1436,12 +1440,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeSVDFactorizationOfWideMatrix() { var matrix = _matrices["Wide2x3"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex[matrix.RowCount]; - var u = new Complex[matrix.RowCount * matrix.RowCount]; - var vt = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex[matrix.RowCount*matrix.RowCount]; + var vt = new Complex[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); @@ -1453,7 +1457,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); @@ -1471,12 +1475,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeSVDFactorizationOfSquareMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex[matrix.RowCount]; - var u = new Complex[matrix.RowCount * matrix.RowCount]; - var vt = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex[matrix.RowCount*matrix.RowCount]; + var vt = new Complex[matrix.ColumnCount*matrix.ColumnCount]; var work = new Complex[100]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); @@ -1489,7 +1493,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); @@ -1510,12 +1514,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeSVDFactorizationOfTallMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex[matrix.ColumnCount]; - var u = new Complex[matrix.RowCount * matrix.RowCount]; - var vt = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex[matrix.RowCount*matrix.RowCount]; + var vt = new Complex[matrix.ColumnCount*matrix.ColumnCount]; var work = new Complex[100]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); @@ -1528,7 +1532,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); @@ -1546,12 +1550,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanComputeSVDFactorizationOfWideMatrixWithWorkArray() { var matrix = _matrices["Wide2x3"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex[matrix.RowCount]; - var u = new Complex[matrix.RowCount * matrix.RowCount]; - var vt = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex[matrix.RowCount*matrix.RowCount]; + var vt = new Complex[matrix.ColumnCount*matrix.ColumnCount]; var work = new Complex[100]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); @@ -1564,7 +1568,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); @@ -1581,17 +1585,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingSVDSquareMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.SvdSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); @@ -1608,17 +1612,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingSVDTallMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.SvdSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); @@ -1634,21 +1638,21 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingSVDSquareMatrixOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex[matrix.RowCount]; - var u = new Complex[matrix.RowCount * matrix.RowCount]; - var vt = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex[matrix.RowCount*matrix.RowCount]; + var vt = new Complex[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.SvdSolveFactored(matrix.RowCount, matrix.ColumnCount, s, u, vt, b, 2, x); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); @@ -1666,21 +1670,21 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex public void CanSolveUsingSVDTallMatrixOnFactoredMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex[matrix.ColumnCount]; - var u = new Complex[matrix.RowCount * matrix.RowCount]; - var vt = new Complex[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex[matrix.RowCount*matrix.RowCount]; + var vt = new Complex[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); - var b = new[] { new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new Complex[matrix.ColumnCount * 2]; + var b = new[] {new Complex(1.0, 0), 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new Complex[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.SvdSolveFactored(matrix.RowCount, matrix.ColumnCount, s, u, vt, b, 2, x); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); @@ -1690,12 +1694,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex [TestCase("Wide10x50000", "Tall50000x10")] [TestCase("Square1000x1000", "Square1000x1000")] - [Timeout(1000 * 10)] + [Timeout(1000*20)] public void IsMatrixMultiplicationPerformant(string leftMatrixKey, string rightMatrixKey) { var leftMatrix = _matrices[leftMatrixKey]; var rightMatrix = _matrices[rightMatrixKey]; - var result = leftMatrix * rightMatrix; + var result = leftMatrix*rightMatrix; Assert.That(result, Is.Not.Null); } @@ -1706,7 +1710,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex /// number of columns. /// array to check. /// matrix to check against. - private static void NotModified(int rows, int columns, IList array, Matrix matrix) + static void NotModified(int rows, int columns, IList array, Matrix matrix) { var index = 0; for (var col = 0; col < columns; col++) diff --git a/src/UnitTests/LinearAlgebraProviderTests/Complex32/LinearAlgebraProviderTests.cs b/src/UnitTests/LinearAlgebraProviderTests/Complex32/LinearAlgebraProviderTests.cs index 2c95c04f..d306bb83 100644 --- a/src/UnitTests/LinearAlgebraProviderTests/Complex32/LinearAlgebraProviderTests.cs +++ b/src/UnitTests/LinearAlgebraProviderTests/Complex32/LinearAlgebraProviderTests.cs @@ -3,7 +3,9 @@ // http://numerics.mathdotnet.com // http://github.com/mathnet/mathnet-numerics // http://mathnetnumerics.codeplex.com -// Copyright (c) 2009-2010 Math.NET +// +// Copyright (c) 2009-2013 Math.NET +// // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without @@ -12,8 +14,10 @@ // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -45,30 +49,30 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 /// /// The Y Complex32 test vector. /// - private readonly Complex32[] _y = new[] { new Complex32(1.1f, 0f), 2.2f, 3.3f, 4.4f, 5.5f }; + readonly Complex32[] _y = new[] {new Complex32(1.1f, 0f), 2.2f, 3.3f, 4.4f, 5.5f}; /// /// The X Complex32 test vector. /// - private readonly Complex32[] _x = new[] { new Complex32(6.6f, 0f), 7.7f, 8.8f, 9.9f, 10.1f }; + readonly Complex32[] _x = new[] {new Complex32(6.6f, 0f), 7.7f, 8.8f, 9.9f, 10.1f}; - private static readonly IContinuousDistribution Dist = new Normal(); + static readonly IContinuousDistribution Dist = new Normal(); /// /// Test matrix to use. /// readonly IDictionary _matrices = new Dictionary - { - { "Singular3x3", new DenseMatrix(new[,] { { new Complex32(1.0f, 0.0f), 1.0f, 2.0f }, { 1.0f, 1.0f, 2.0f }, { 1.0f, 1.0f, 2.0f } }) }, - { "Square3x3", new DenseMatrix(new[,] { { new Complex32(-1.1f, 0.0f), -2.2f, -3.3f }, { 0.0f, 1.1f, 2.2f }, { -4.4f, 5.5f, 6.6f } }) }, - { "Square4x4", new DenseMatrix(new[,] { { new Complex32(-1.1f, 0.0f), -2.2f, -3.3f, -4.4f }, { 0.0f, 1.1f, 2.2f, 3.3f }, { 1.0f, 2.1f, 6.2f, 4.3f }, { -4.4f, 5.5f, 6.6f, -7.7f } }) }, - { "Singular4x4", new DenseMatrix(new[,] { { new Complex32(-1.1f, 0.0f), -2.2f, -3.3f, -4.4f }, { -1.1f, -2.2f, -3.3f, -4.4f }, { -1.1f, -2.2f, -3.3f, -4.4f }, { -1.1f, -2.2f, -3.3f, -4.4f } }) }, - { "Tall3x2", new DenseMatrix(new[,] { { new Complex32(-1.1f, 0.0f), -2.2f }, { 0.0f, 1.1f }, { -4.4f, 5.5f } }) }, - { "Wide2x3", new DenseMatrix(new[,] { { new Complex32(-1.1f, 0.0f), -2.2f, -3.3f }, { 0.0f, 1.1f, 2.2f } }) }, - { "Tall50000x10", DenseMatrix.CreateRandom(50000, 10, Dist) }, - { "Wide10x50000", DenseMatrix.CreateRandom(10, 50000, Dist) }, - { "Square1000x1000", DenseMatrix.CreateRandom(1000, 1000, Dist) } - }; + { + {"Singular3x3", new DenseMatrix(new[,] {{new Complex32(1.0f, 0.0f), 1.0f, 2.0f}, {1.0f, 1.0f, 2.0f}, {1.0f, 1.0f, 2.0f}})}, + {"Square3x3", new DenseMatrix(new[,] {{new Complex32(-1.1f, 0.0f), -2.2f, -3.3f}, {0.0f, 1.1f, 2.2f}, {-4.4f, 5.5f, 6.6f}})}, + {"Square4x4", new DenseMatrix(new[,] {{new Complex32(-1.1f, 0.0f), -2.2f, -3.3f, -4.4f}, {0.0f, 1.1f, 2.2f, 3.3f}, {1.0f, 2.1f, 6.2f, 4.3f}, {-4.4f, 5.5f, 6.6f, -7.7f}})}, + {"Singular4x4", new DenseMatrix(new[,] {{new Complex32(-1.1f, 0.0f), -2.2f, -3.3f, -4.4f}, {-1.1f, -2.2f, -3.3f, -4.4f}, {-1.1f, -2.2f, -3.3f, -4.4f}, {-1.1f, -2.2f, -3.3f, -4.4f}})}, + {"Tall3x2", new DenseMatrix(new[,] {{new Complex32(-1.1f, 0.0f), -2.2f}, {0.0f, 1.1f}, {-4.4f, 5.5f}})}, + {"Wide2x3", new DenseMatrix(new[,] {{new Complex32(-1.1f, 0.0f), -2.2f, -3.3f}, {0.0f, 1.1f, 2.2f}})}, + {"Tall50000x10", DenseMatrix.CreateRandom(50000, 10, Dist)}, + {"Wide10x50000", DenseMatrix.CreateRandom(10, 50000, Dist)}, + {"Square1000x1000", DenseMatrix.CreateRandom(1000, 1000, Dist)} + }; /// /// Can add a vector to scaled vector @@ -92,10 +96,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 } Array.Copy(_y, result, _y.Length); - Control.LinearAlgebraProvider.AddVectorToScaledVector(result, (Complex32)Math.PI, _x, result); + Control.LinearAlgebraProvider.AddVectorToScaledVector(result, (Complex32) Math.PI, _x, result); for (var i = 0; i < _y.Length; i++) { - AssertHelpers.AlmostEqual(_y[i] + ((Complex32)Math.PI * _x[i]), result[i], 6); + AssertHelpers.AlmostEqual(_y[i] + ((Complex32) Math.PI*_x[i]), result[i], 6); } } @@ -114,10 +118,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 } Array.Copy(_y, result, _y.Length); - Control.LinearAlgebraProvider.ScaleArray((Complex32)Math.PI, result, result); + Control.LinearAlgebraProvider.ScaleArray((Complex32) Math.PI, result, result); for (var i = 0; i < _y.Length; i++) { - AssertHelpers.AlmostEqual(_y[i] * (Complex32)Math.PI, result[i], 6); + AssertHelpers.AlmostEqual(_y[i]*(Complex32) Math.PI, result[i], 6); } } @@ -169,7 +173,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 Control.LinearAlgebraProvider.PointWiseMultiplyArrays(_x, _y, result); for (var i = 0; i < result.Length; i++) { - Assert.AreEqual(_x[i] * _y[i], result[i]); + Assert.AreEqual(_x[i]*_y[i], result[i]); } } @@ -183,7 +187,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 Control.LinearAlgebraProvider.PointWiseDivideArrays(_x, _y, result); for (var i = 0; i < result.Length; i++) { - Assert.AreEqual(_x[i] / _y[i], result[i]); + Assert.AreEqual(_x[i]/_y[i], result[i]); } } @@ -275,7 +279,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 6); + AssertHelpers.AlmostEqual(x.Row(i)*y.Column(j), c[i, j], 6); } } } @@ -296,7 +300,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 6); + AssertHelpers.AlmostEqual(x.Row(i)*y.Column(j), c[i, j], 6); } } } @@ -317,7 +321,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 6); + AssertHelpers.AlmostEqual(x.Row(i)*y.Column(j), c[i, j], 6); } } } @@ -338,7 +342,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(2.2f * x.Row(i) * y.Column(j), c[i, j], 6); + AssertHelpers.AlmostEqual(2.2f*x.Row(i)*y.Column(j), c[i, j], 6); } } } @@ -359,7 +363,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(2.2f * x.Row(i) * y.Column(j), c[i, j], 6); + AssertHelpers.AlmostEqual(2.2f*x.Row(i)*y.Column(j), c[i, j], 6); } } } @@ -380,7 +384,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 { for (var j = 0; j < c.ColumnCount; j++) { - var test = 2.2f * x.Row(i) * y.Column(j); + var test = 2.2f*x.Row(i)*y.Column(j); // if they are both close to zero, skip if (Math.Abs(test.Real) < 1e-7 && Math.Abs(c[i, j].Real) < 1e-7) @@ -388,7 +392,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 continue; } - AssertHelpers.AlmostEqual(2.2f * x.Row(i) * y.Column(j), c[i, j], 6); + AssertHelpers.AlmostEqual(2.2f*x.Row(i)*y.Column(j), c[i, j], 6); } } } @@ -400,7 +404,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeLuFactor() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.RowCount]; + var a = new Complex32[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var ipiv = new int[matrix.RowCount]; @@ -428,7 +432,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeLuInverse() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.RowCount]; + var a = new Complex32[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); Control.LinearAlgebraProvider.LUInverse(a, matrix.RowCount); @@ -452,7 +456,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeLuInverseOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.RowCount]; + var a = new Complex32[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var ipiv = new int[matrix.RowCount]; @@ -479,7 +483,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeLuInverseWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.RowCount]; + var a = new Complex32[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var work = new Complex32[matrix.RowCount]; @@ -504,7 +508,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeLuInverseOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.RowCount]; + var a = new Complex32[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var ipiv = new int[matrix.RowCount]; @@ -532,10 +536,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingLU() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.RowCount]; + var a = new Complex32[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; Control.LinearAlgebraProvider.LUSolve(2, a, matrix.RowCount, b); AssertHelpers.AlmostEqual(b[0], -1.477272727272726f, 6); @@ -555,13 +559,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingLUOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.RowCount]; + var a = new Complex32[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var ipiv = new int[matrix.RowCount]; Control.LinearAlgebraProvider.LUFactor(a, matrix.RowCount, ipiv); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; Control.LinearAlgebraProvider.LUSolveFactored(2, a, matrix.RowCount, ipiv, b); AssertHelpers.AlmostEqual(b[0], -1.477272727272726f, 6); @@ -578,7 +582,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 [Test] public void CanComputeCholeskyFactor() { - var matrix = new Complex32[] { 1, 1, 1, 1, 1, 5, 5, 5, 1, 5, 14, 14, 1, 5, 14, 15 }; + var matrix = new Complex32[] {1, 1, 1, 1, 1, 5, 5, 5, 1, 5, 14, 14, 1, 5, 14, 15}; Control.LinearAlgebraProvider.CholeskyFactor(matrix, 4); Assert.AreEqual(matrix[0].Real, 1); Assert.AreEqual(matrix[1].Real, 1); @@ -604,10 +608,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 [Test] public void CanSolveUsingCholesky() { - var matrix = new DenseMatrix(3, 3, new Complex32[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 }); - var a = new Complex32[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 }; + var matrix = new DenseMatrix(3, 3, new Complex32[] {1, 1, 1, 1, 2, 3, 1, 3, 6}); + var a = new Complex32[] {1, 1, 1, 1, 2, 3, 1, 3, 6}; - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; Control.LinearAlgebraProvider.CholeskySolve(a, 3, b, 2); AssertHelpers.AlmostEqual(b[0], 0, 6); @@ -626,11 +630,11 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 [Test] public void CanSolveUsingCholeskyOnFactoredMatrix() { - var a = new Complex32[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 }; + var a = new Complex32[] {1, 1, 1, 1, 2, 3, 1, 3, 6}; Control.LinearAlgebraProvider.CholeskyFactor(a, 3); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; Control.LinearAlgebraProvider.CholeskySolveFactored(a, 3, b, 2); AssertHelpers.AlmostEqual(b[0], 0, 6); @@ -648,16 +652,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeQRFactorSquareMatrix() { var matrix = _matrices["Square3x3"]; - var r = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var r = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new Complex32[3]; - var q = new Complex32[matrix.RowCount * matrix.RowCount]; + var q = new Complex32[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -675,16 +679,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeQRFactorTallMatrix() { var matrix = _matrices["Tall3x2"]; - var r = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var r = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new Complex32[3]; - var q = new Complex32[matrix.RowCount * matrix.RowCount]; + var q = new Complex32[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -702,16 +706,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeQRFactorWideMatrix() { var matrix = _matrices["Wide2x3"]; - var r = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var r = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new Complex32[3]; - var q = new Complex32[matrix.RowCount * matrix.RowCount]; + var q = new Complex32[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -729,17 +733,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeQRFactorSquareMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var r = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var r = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new Complex32[3]; - var q = new Complex32[matrix.RowCount * matrix.RowCount]; - var work = new Complex32[matrix.ColumnCount * Control.BlockSize]; + var q = new Complex32[matrix.RowCount*matrix.RowCount]; + var work = new Complex32[matrix.ColumnCount*Control.BlockSize]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -757,17 +761,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeQRFactorTallMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var r = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var r = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new Complex32[3]; - var q = new Complex32[matrix.RowCount * matrix.RowCount]; - var work = new Complex32[matrix.ColumnCount * Control.BlockSize]; + var q = new Complex32[matrix.RowCount*matrix.RowCount]; + var work = new Complex32[matrix.ColumnCount*Control.BlockSize]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -785,17 +789,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeQRFactorWideMatrixWithWorkArray() { var matrix = _matrices["Wide2x3"]; - var r = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var r = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new Complex32[3]; - var q = new Complex32[matrix.RowCount * matrix.RowCount]; - var work = new Complex32[matrix.ColumnCount * Control.BlockSize]; + var q = new Complex32[matrix.RowCount*matrix.RowCount]; + var work = new Complex32[matrix.ColumnCount*Control.BlockSize]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -813,16 +817,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeThinQRFactorSquareMatrix() { var matrix = _matrices["Square3x3"]; - var r = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; var tau = new Complex32[3]; - var q = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var q = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, q, q.Length); Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau); var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -840,16 +844,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeThinQRFactorTallMatrix() { var matrix = _matrices["Tall3x2"]; - var r = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; var tau = new Complex32[3]; - var q = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var q = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, q, q.Length); Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau); var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -867,17 +871,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeThinQRFactorSquareMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var r = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; var tau = new Complex32[3]; - var q = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var q = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, q, q.Length); - var work = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var work = new Complex32[matrix.RowCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau, work); var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -895,17 +899,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeThinQRFactorTallMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var r = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; var tau = new Complex32[3]; - var q = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var q = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, q, q.Length); - var work = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var work = new Complex32[matrix.RowCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau, work); var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { for (var col = 0; col < matrix.ColumnCount; col++) @@ -922,17 +926,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingQRSquareMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -949,17 +953,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingQRTallMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -975,18 +979,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingQRSquareMatrixUsingWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; - var work = new Complex32[matrix.RowCount * matrix.RowCount]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; + var work = new Complex32[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1004,18 +1008,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingQRTallMatrixUsingWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; - var work = new Complex32[matrix.RowCount * matrix.RowCount]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; + var work = new Complex32[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1031,19 +1035,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingQRSquareMatrixOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.RowCount]; + var a = new Complex32[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex32[matrix.ColumnCount]; - var q = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var q = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1061,19 +1065,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingQRTallMatrixOnFactoredMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex32[matrix.ColumnCount]; - var q = new Complex32[matrix.RowCount * matrix.RowCount]; + var q = new Complex32[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1089,20 +1093,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingQRSquareMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.RowCount]; + var a = new Complex32[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex32[matrix.ColumnCount]; - var q = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var q = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; var work = new Complex32[2048]; Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau, work); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1120,20 +1124,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingQRTallMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex32[matrix.ColumnCount]; - var q = new Complex32[matrix.RowCount * matrix.RowCount]; + var q = new Complex32[matrix.RowCount*matrix.RowCount]; var work = new Complex32[2048]; Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau, work); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1148,17 +1152,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingThinQRSquareMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, QRMethod.Thin); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1175,17 +1179,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingThinQRTallMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, QRMethod.Thin); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1201,18 +1205,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingThinQRSquareMatrixUsingWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; - var work = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; + var work = new Complex32[matrix.RowCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work, QRMethod.Thin); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1230,18 +1234,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingThinQRTallMatrixUsingWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; - var work = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; + var work = new Complex32[matrix.RowCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work, QRMethod.Thin); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1257,19 +1261,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingThinQRSquareMatrixOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex32[matrix.ColumnCount]; - var r = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, QRMethod.Thin); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1287,19 +1291,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingThinQRTallMatrixOnFactoredMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex32[matrix.ColumnCount]; - var r = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, QRMethod.Thin); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1315,20 +1319,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingThinQRSquareMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex32[matrix.ColumnCount]; - var r = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; var work = new Complex32[2048]; Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau, work); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work, QRMethod.Thin); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1346,20 +1350,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingThinQRTallMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new Complex32[matrix.ColumnCount]; - var r = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var r = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; var work = new Complex32[2048]; Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau, work); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work, QRMethod.Thin); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1374,12 +1378,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeSVDFactorizationOfSquareMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex32[matrix.RowCount]; - var u = new Complex32[matrix.RowCount * matrix.RowCount]; - var vt = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex32[matrix.RowCount*matrix.RowCount]; + var vt = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); @@ -1391,7 +1395,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 6); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 6); @@ -1411,12 +1415,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeSVDFactorizationOfTallMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex32[matrix.ColumnCount]; - var u = new Complex32[matrix.RowCount * matrix.RowCount]; - var vt = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex32[matrix.RowCount*matrix.RowCount]; + var vt = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); @@ -1428,7 +1432,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 6); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 6); @@ -1445,12 +1449,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeSVDFactorizationOfWideMatrix() { var matrix = _matrices["Wide2x3"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex32[matrix.RowCount]; - var u = new Complex32[matrix.RowCount * matrix.RowCount]; - var vt = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex32[matrix.RowCount*matrix.RowCount]; + var vt = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); @@ -1462,7 +1466,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 6); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 6); @@ -1480,12 +1484,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeSVDFactorizationOfSquareMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex32[matrix.RowCount]; - var u = new Complex32[matrix.RowCount * matrix.RowCount]; - var vt = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex32[matrix.RowCount*matrix.RowCount]; + var vt = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; var work = new Complex32[100]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); @@ -1498,7 +1502,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 6); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 6); @@ -1519,12 +1523,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeSVDFactorizationOfTallMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex32[matrix.ColumnCount]; - var u = new Complex32[matrix.RowCount * matrix.RowCount]; - var vt = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex32[matrix.RowCount*matrix.RowCount]; + var vt = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; var work = new Complex32[100]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); @@ -1537,7 +1541,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 6); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 6); @@ -1555,12 +1559,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanComputeSVDFactorizationOfWideMatrixWithWorkArray() { var matrix = _matrices["Wide2x3"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex32[matrix.RowCount]; - var u = new Complex32[matrix.RowCount * matrix.RowCount]; - var vt = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex32[matrix.RowCount*matrix.RowCount]; + var vt = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; var work = new Complex32[100]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); @@ -1573,7 +1577,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 6); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 6); @@ -1590,17 +1594,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingSVDSquareMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.SvdSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 6); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 6); @@ -1617,17 +1621,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingSvdTallMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.SvdSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 5); AssertHelpers.AlmostEqual(test[1, 0], x[1], 5); @@ -1643,21 +1647,21 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingSvdSquareMatrixOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex32[matrix.RowCount]; - var u = new Complex32[matrix.RowCount * matrix.RowCount]; - var vt = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex32[matrix.RowCount*matrix.RowCount]; + var vt = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.SvdSolveFactored(matrix.RowCount, matrix.ColumnCount, s, u, vt, b, 2, x); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1675,21 +1679,21 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 public void CanSolveUsingSvdTallMatrixOnFactoredMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new Complex32[matrix.RowCount * matrix.ColumnCount]; + var a = new Complex32[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new Complex32[matrix.ColumnCount]; - var u = new Complex32[matrix.RowCount * matrix.RowCount]; - var vt = new Complex32[matrix.ColumnCount * matrix.ColumnCount]; + var u = new Complex32[matrix.RowCount*matrix.RowCount]; + var vt = new Complex32[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); - var b = new[] { new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new Complex32[matrix.ColumnCount * 2]; + var b = new[] {new Complex32(1.0f, 0.0f), 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new Complex32[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.SvdSolveFactored(matrix.RowCount, matrix.ColumnCount, s, u, vt, b, 2, x); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 5); AssertHelpers.AlmostEqual(test[1, 0], x[1], 5); @@ -1699,12 +1703,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 [TestCase("Wide10x50000", "Tall50000x10")] [TestCase("Square1000x1000", "Square1000x1000")] - [Timeout(1000 * 10)] + [Timeout(1000*20)] public void IsMatrixMultiplicationPerformant(string leftMatrixKey, string rightMatrixKey) { var leftMatrix = _matrices[leftMatrixKey]; var rightMatrix = _matrices[rightMatrixKey]; - var result = leftMatrix * rightMatrix; + var result = leftMatrix*rightMatrix; Assert.That(result, Is.Not.Null); } @@ -1715,7 +1719,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex32 /// number of columns. /// array to check. /// matrix to check against. - private static void NotModified(int rows, int columns, IList array, Matrix matrix) + static void NotModified(int rows, int columns, IList array, Matrix matrix) { var index = 0; for (var col = 0; col < columns; col++) diff --git a/src/UnitTests/LinearAlgebraProviderTests/Double/LinearAlgebraProviderTests.cs b/src/UnitTests/LinearAlgebraProviderTests/Double/LinearAlgebraProviderTests.cs index 5951e573..0f4c1e4e 100644 --- a/src/UnitTests/LinearAlgebraProviderTests/Double/LinearAlgebraProviderTests.cs +++ b/src/UnitTests/LinearAlgebraProviderTests/Double/LinearAlgebraProviderTests.cs @@ -3,7 +3,9 @@ // http://numerics.mathdotnet.com // http://github.com/mathnet/mathnet-numerics // http://mathnetnumerics.codeplex.com -// Copyright (c) 2009-2010 Math.NET +// +// Copyright (c) 2009-2013 Math.NET +// // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without @@ -12,8 +14,10 @@ // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -44,1661 +48,1661 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Double /// /// The Y double test vector. /// - private readonly double[] _y = new[] { 1.1, 2.2, 3.3, 4.4, 5.5 }; + readonly double[] _y = new[] {1.1, 2.2, 3.3, 4.4, 5.5}; /// /// The X double test vector. /// - private readonly double[] _x = new[] { 6.6, 7.7, 8.8, 9.9, 10.1 }; + readonly double[] _x = new[] {6.6, 7.7, 8.8, 9.9, 10.1}; - private static readonly IContinuousDistribution Dist = new Normal(); + static readonly IContinuousDistribution Dist = new Normal(); /// /// Test matrix to use. /// readonly IDictionary _matrices = new Dictionary - { - { "Singular3x3", new DenseMatrix(new[,] { { 1.0, 1.0, 2.0 }, { 1.0, 1.0, 2.0 }, { 1.0, 1.0, 2.0 } }) }, - { "Square3x3", new DenseMatrix(new[,] { { -1.1, -2.2, -3.3 }, { 0.0, 1.1, 2.2 }, { -4.4, 5.5, 6.6 } }) }, - { "Square4x4", new DenseMatrix(new[,] { { -1.1, -2.2, -3.3, -4.4 }, { 0.0, 1.1, 2.2, 3.3 }, { 1.0, 2.1, 6.2, 4.3 }, { -4.4, 5.5, 6.6, -7.7 } }) }, - { "Singular4x4", new DenseMatrix(new[,] { { -1.1, -2.2, -3.3, -4.4 }, { -1.1, -2.2, -3.3, -4.4 }, { -1.1, -2.2, -3.3, -4.4 }, { -1.1, -2.2, -3.3, -4.4 } }) }, - { "Tall3x2", new DenseMatrix(new[,] { { -1.1, -2.2 }, { 0.0, 1.1 }, { -4.4, 5.5 } }) }, - { "Wide2x3", new DenseMatrix(new[,] { { -1.1, -2.2, -3.3 }, { 0.0, 1.1, 2.2 } }) }, - { "Tall50000x10", DenseMatrix.CreateRandom(50000, 10, Dist) }, - { "Wide10x50000", DenseMatrix.CreateRandom(10, 50000, Dist) }, - { "Square1000x1000", DenseMatrix.CreateRandom(1000, 1000, Dist) } - }; - - /// - /// Can add a vector to scaled vector - /// - [Test] - public void CanAddVectorToScaledVectorDouble() { - var result = new double[_y.Length]; - - Control.LinearAlgebraProvider.AddVectorToScaledVector(_y, 0, _x, result); - for (var i = 0; i < _y.Length; i++) - { - Assert.AreEqual(_y[i], result[i]); - } - - Array.Copy(_y, result, _y.Length); - Control.LinearAlgebraProvider.AddVectorToScaledVector(result, 1, _x, result); - for (var i = 0; i < _y.Length; i++) - { - Assert.AreEqual(_y[i] + _x[i], result[i]); - } + {"Singular3x3", new DenseMatrix(new[,] {{1.0, 1.0, 2.0}, {1.0, 1.0, 2.0}, {1.0, 1.0, 2.0}})}, + {"Square3x3", new DenseMatrix(new[,] {{-1.1, -2.2, -3.3}, {0.0, 1.1, 2.2}, {-4.4, 5.5, 6.6}})}, + {"Square4x4", new DenseMatrix(new[,] {{-1.1, -2.2, -3.3, -4.4}, {0.0, 1.1, 2.2, 3.3}, {1.0, 2.1, 6.2, 4.3}, {-4.4, 5.5, 6.6, -7.7}})}, + {"Singular4x4", new DenseMatrix(new[,] {{-1.1, -2.2, -3.3, -4.4}, {-1.1, -2.2, -3.3, -4.4}, {-1.1, -2.2, -3.3, -4.4}, {-1.1, -2.2, -3.3, -4.4}})}, + {"Tall3x2", new DenseMatrix(new[,] {{-1.1, -2.2}, {0.0, 1.1}, {-4.4, 5.5}})}, + {"Wide2x3", new DenseMatrix(new[,] {{-1.1, -2.2, -3.3}, {0.0, 1.1, 2.2}})}, + {"Tall50000x10", DenseMatrix.CreateRandom(50000, 10, Dist)}, + {"Wide10x50000", DenseMatrix.CreateRandom(10, 50000, Dist)}, + {"Square1000x1000", DenseMatrix.CreateRandom(1000, 1000, Dist)} + }; - Array.Copy(_y, result, _y.Length); - Control.LinearAlgebraProvider.AddVectorToScaledVector(result, Math.PI, _x, result); - for (var i = 0; i < _y.Length; i++) - { - Assert.AreEqual(_y[i] + (Math.PI * _x[i]), result[i]); - } - } + /// + /// Can add a vector to scaled vector + /// + [Test] + public void CanAddVectorToScaledVectorDouble() + { + var result = new double[_y.Length]; - /// - /// Can scale an array. - /// - [Test] - public void CanScaleArray() + Control.LinearAlgebraProvider.AddVectorToScaledVector(_y, 0, _x, result); + for (var i = 0; i < _y.Length; i++) { - var result = new double[_y.Length]; - - Control.LinearAlgebraProvider.ScaleArray(1, _y, result); - for (var i = 0; i < _y.Length; i++) - { - Assert.AreEqual(_y[i], result[i]); - } - - Array.Copy(_y, result, _y.Length); - Control.LinearAlgebraProvider.ScaleArray(Math.PI, result, result); - for (var i = 0; i < _y.Length; i++) - { - Assert.AreEqual(_y[i] * Math.PI, result[i]); - } + Assert.AreEqual(_y[i], result[i]); } - /// - /// Can compute the dot product. - /// - [Test] - public void CanComputeDotProduct() + Array.Copy(_y, result, _y.Length); + Control.LinearAlgebraProvider.AddVectorToScaledVector(result, 1, _x, result); + for (var i = 0; i < _y.Length; i++) { - var result = Control.LinearAlgebraProvider.DotProduct(_x, _y); - AssertHelpers.AlmostEqual(152.35, result, 15); + Assert.AreEqual(_y[i] + _x[i], result[i]); } - /// - /// Can add two arrays. - /// - [Test] - public void CanAddArrays() + Array.Copy(_y, result, _y.Length); + Control.LinearAlgebraProvider.AddVectorToScaledVector(result, Math.PI, _x, result); + for (var i = 0; i < _y.Length; i++) { - var result = new double[_y.Length]; - Control.LinearAlgebraProvider.AddArrays(_x, _y, result); - for (var i = 0; i < result.Length; i++) - { - Assert.AreEqual(_x[i] + _y[i], result[i]); - } + Assert.AreEqual(_y[i] + (Math.PI*_x[i]), result[i]); } + } - /// - /// Can subtract two arrays. - /// - [Test] - public void CanSubtractArrays() - { - var result = new double[_y.Length]; - Control.LinearAlgebraProvider.SubtractArrays(_x, _y, result); - for (var i = 0; i < result.Length; i++) - { - Assert.AreEqual(_x[i] - _y[i], result[i]); - } - } + /// + /// Can scale an array. + /// + [Test] + public void CanScaleArray() + { + var result = new double[_y.Length]; - /// - /// Can pointwise multiply two arrays. - /// - [Test] - public void CanPointWiseMultiplyArrays() + Control.LinearAlgebraProvider.ScaleArray(1, _y, result); + for (var i = 0; i < _y.Length; i++) { - var result = new double[_y.Length]; - Control.LinearAlgebraProvider.PointWiseMultiplyArrays(_x, _y, result); - for (var i = 0; i < result.Length; i++) - { - Assert.AreEqual(_x[i] * _y[i], result[i]); - } + Assert.AreEqual(_y[i], result[i]); } - /// - /// Can pointwise divide two arrays. - /// - [Test] - public void CanPointWiseDivideArrays() + Array.Copy(_y, result, _y.Length); + Control.LinearAlgebraProvider.ScaleArray(Math.PI, result, result); + for (var i = 0; i < _y.Length; i++) { - var result = new double[_y.Length]; - Control.LinearAlgebraProvider.PointWiseDivideArrays(_x, _y, result); - for (var i = 0; i < result.Length; i++) - { - Assert.AreEqual(_x[i] / _y[i], result[i]); - } + Assert.AreEqual(_y[i]*Math.PI, result[i]); } + } - /// - /// Can compute L1 norm. - /// - [Test] - public void CanComputeMatrixL1Norm() - { - var matrix = _matrices["Square3x3"]; - var work = new double[matrix.RowCount]; - var norm = Control.LinearAlgebraProvider.MatrixNorm(Norm.OneNorm, matrix.RowCount, matrix.ColumnCount, matrix.Values, work); - AssertHelpers.AlmostEqual(12.1, norm, 6); - } + /// + /// Can compute the dot product. + /// + [Test] + public void CanComputeDotProduct() + { + var result = Control.LinearAlgebraProvider.DotProduct(_x, _y); + AssertHelpers.AlmostEqual(152.35, result, 15); + } - /// - /// Can compute Frobenius norm. - /// - [Test] - public void CanComputeMatrixFrobeniusNorm() + /// + /// Can add two arrays. + /// + [Test] + public void CanAddArrays() + { + var result = new double[_y.Length]; + Control.LinearAlgebraProvider.AddArrays(_x, _y, result); + for (var i = 0; i < result.Length; i++) { - var matrix = _matrices["Square3x3"]; - var work = new double[matrix.RowCount]; - var norm = Control.LinearAlgebraProvider.MatrixNorm(Norm.FrobeniusNorm, matrix.RowCount, matrix.ColumnCount, matrix.Values, work); - AssertHelpers.AlmostEqual(10.777754868246, norm, 8); + Assert.AreEqual(_x[i] + _y[i], result[i]); } + } - /// - /// Can compute Infinity norm. - /// - [Test] - public void CanComputeMatrixInfinityNorm() + /// + /// Can subtract two arrays. + /// + [Test] + public void CanSubtractArrays() + { + var result = new double[_y.Length]; + Control.LinearAlgebraProvider.SubtractArrays(_x, _y, result); + for (var i = 0; i < result.Length; i++) { - var matrix = _matrices["Square3x3"]; - var work = new double[matrix.RowCount]; - var norm = Control.LinearAlgebraProvider.MatrixNorm(Norm.InfinityNorm, matrix.RowCount, matrix.ColumnCount, matrix.Values, work); - Assert.AreEqual(16.5, norm); + Assert.AreEqual(_x[i] - _y[i], result[i]); } + } - /// - /// Can compute L1 norm using a work array. - /// - [Test] - public void CanComputeMatrixL1NormWithWorkArray() + /// + /// Can pointwise multiply two arrays. + /// + [Test] + public void CanPointWiseMultiplyArrays() + { + var result = new double[_y.Length]; + Control.LinearAlgebraProvider.PointWiseMultiplyArrays(_x, _y, result); + for (var i = 0; i < result.Length; i++) { - var matrix = _matrices["Square3x3"]; - var work = new double[18]; - var norm = Control.LinearAlgebraProvider.MatrixNorm(Norm.OneNorm, matrix.RowCount, matrix.ColumnCount, matrix.Values, work); - AssertHelpers.AlmostEqual(12.1, norm, 6); + Assert.AreEqual(_x[i]*_y[i], result[i]); } + } - /// - /// Can compute Frobenius norm using a work array. - /// - [Test] - public void CanComputeMatrixFrobeniusNormWithWorkArray() + /// + /// Can pointwise divide two arrays. + /// + [Test] + public void CanPointWiseDivideArrays() + { + var result = new double[_y.Length]; + Control.LinearAlgebraProvider.PointWiseDivideArrays(_x, _y, result); + for (var i = 0; i < result.Length; i++) { - var matrix = _matrices["Square3x3"]; - var work = new double[18]; - var norm = Control.LinearAlgebraProvider.MatrixNorm(Norm.FrobeniusNorm, matrix.RowCount, matrix.ColumnCount, matrix.Values, work); - AssertHelpers.AlmostEqual(10.777754868246, norm, 8); + Assert.AreEqual(_x[i]/_y[i], result[i]); } + } - /// - /// Can compute Infinity norm using a work array. - /// - [Test] - public void CanComputeMatrixInfinityNormWithWorkArray() - { - var matrix = _matrices["Square3x3"]; - var work = new double[18]; - var norm = Control.LinearAlgebraProvider.MatrixNorm(Norm.InfinityNorm, matrix.RowCount, matrix.ColumnCount, matrix.Values, work); - Assert.AreEqual(16.5, norm); - } + /// + /// Can compute L1 norm. + /// + [Test] + public void CanComputeMatrixL1Norm() + { + var matrix = _matrices["Square3x3"]; + var work = new double[matrix.RowCount]; + var norm = Control.LinearAlgebraProvider.MatrixNorm(Norm.OneNorm, matrix.RowCount, matrix.ColumnCount, matrix.Values, work); + AssertHelpers.AlmostEqual(12.1, norm, 6); + } - /// - /// Can multiply two square matrices. - /// - [Test] - public void CanMultiplySquareMatrices() - { - var x = _matrices["Singular3x3"]; - var y = _matrices["Square3x3"]; - var c = new DenseMatrix(x.RowCount, y.ColumnCount); + /// + /// Can compute Frobenius norm. + /// + [Test] + public void CanComputeMatrixFrobeniusNorm() + { + var matrix = _matrices["Square3x3"]; + var work = new double[matrix.RowCount]; + var norm = Control.LinearAlgebraProvider.MatrixNorm(Norm.FrobeniusNorm, matrix.RowCount, matrix.ColumnCount, matrix.Values, work); + AssertHelpers.AlmostEqual(10.777754868246, norm, 8); + } + + /// + /// Can compute Infinity norm. + /// + [Test] + public void CanComputeMatrixInfinityNorm() + { + var matrix = _matrices["Square3x3"]; + var work = new double[matrix.RowCount]; + var norm = Control.LinearAlgebraProvider.MatrixNorm(Norm.InfinityNorm, matrix.RowCount, matrix.ColumnCount, matrix.Values, work); + Assert.AreEqual(16.5, norm); + } + + /// + /// Can compute L1 norm using a work array. + /// + [Test] + public void CanComputeMatrixL1NormWithWorkArray() + { + var matrix = _matrices["Square3x3"]; + var work = new double[18]; + var norm = Control.LinearAlgebraProvider.MatrixNorm(Norm.OneNorm, matrix.RowCount, matrix.ColumnCount, matrix.Values, work); + AssertHelpers.AlmostEqual(12.1, norm, 6); + } + + /// + /// Can compute Frobenius norm using a work array. + /// + [Test] + public void CanComputeMatrixFrobeniusNormWithWorkArray() + { + var matrix = _matrices["Square3x3"]; + var work = new double[18]; + var norm = Control.LinearAlgebraProvider.MatrixNorm(Norm.FrobeniusNorm, matrix.RowCount, matrix.ColumnCount, matrix.Values, work); + AssertHelpers.AlmostEqual(10.777754868246, norm, 8); + } - Control.LinearAlgebraProvider.MatrixMultiply(x.Values, x.RowCount, x.ColumnCount, y.Values, y.RowCount, y.ColumnCount, c.Values); + /// + /// Can compute Infinity norm using a work array. + /// + [Test] + public void CanComputeMatrixInfinityNormWithWorkArray() + { + var matrix = _matrices["Square3x3"]; + var work = new double[18]; + var norm = Control.LinearAlgebraProvider.MatrixNorm(Norm.InfinityNorm, matrix.RowCount, matrix.ColumnCount, matrix.Values, work); + Assert.AreEqual(16.5, norm); + } - for (var i = 0; i < c.RowCount; i++) + /// + /// Can multiply two square matrices. + /// + [Test] + public void CanMultiplySquareMatrices() + { + var x = _matrices["Singular3x3"]; + var y = _matrices["Square3x3"]; + var c = new DenseMatrix(x.RowCount, y.ColumnCount); + + Control.LinearAlgebraProvider.MatrixMultiply(x.Values, x.RowCount, x.ColumnCount, y.Values, y.RowCount, y.ColumnCount, c.Values); + + for (var i = 0; i < c.RowCount; i++) + { + for (var j = 0; j < c.ColumnCount; j++) { - for (var j = 0; j < c.ColumnCount; j++) - { - AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 15); - } + AssertHelpers.AlmostEqual(x.Row(i)*y.Column(j), c[i, j], 15); } } + } - /// - /// Can multiply a wide and tall matrix. - /// - [Test] - public void CanMultiplyWideAndTallMatrices() - { - var x = _matrices["Wide2x3"]; - var y = _matrices["Tall3x2"]; - var c = new DenseMatrix(x.RowCount, y.ColumnCount); + /// + /// Can multiply a wide and tall matrix. + /// + [Test] + public void CanMultiplyWideAndTallMatrices() + { + var x = _matrices["Wide2x3"]; + var y = _matrices["Tall3x2"]; + var c = new DenseMatrix(x.RowCount, y.ColumnCount); - Control.LinearAlgebraProvider.MatrixMultiply(x.Values, x.RowCount, x.ColumnCount, y.Values, y.RowCount, y.ColumnCount, c.Values); + Control.LinearAlgebraProvider.MatrixMultiply(x.Values, x.RowCount, x.ColumnCount, y.Values, y.RowCount, y.ColumnCount, c.Values); - for (var i = 0; i < c.RowCount; i++) + for (var i = 0; i < c.RowCount; i++) + { + for (var j = 0; j < c.ColumnCount; j++) { - for (var j = 0; j < c.ColumnCount; j++) - { - AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 15); - } + AssertHelpers.AlmostEqual(x.Row(i)*y.Column(j), c[i, j], 15); } } + } - /// - /// Can multiply a tall and wide matrix. - /// - [Test] - public void CanMultiplyTallAndWideMatrices() - { - var x = _matrices["Tall3x2"]; - var y = _matrices["Wide2x3"]; - var c = new DenseMatrix(x.RowCount, y.ColumnCount); + /// + /// Can multiply a tall and wide matrix. + /// + [Test] + public void CanMultiplyTallAndWideMatrices() + { + var x = _matrices["Tall3x2"]; + var y = _matrices["Wide2x3"]; + var c = new DenseMatrix(x.RowCount, y.ColumnCount); - Control.LinearAlgebraProvider.MatrixMultiply(x.Values, x.RowCount, x.ColumnCount, y.Values, y.RowCount, y.ColumnCount, c.Values); + Control.LinearAlgebraProvider.MatrixMultiply(x.Values, x.RowCount, x.ColumnCount, y.Values, y.RowCount, y.ColumnCount, c.Values); - for (var i = 0; i < c.RowCount; i++) + for (var i = 0; i < c.RowCount; i++) + { + for (var j = 0; j < c.ColumnCount; j++) { - for (var j = 0; j < c.ColumnCount; j++) - { - AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 15); - } + AssertHelpers.AlmostEqual(x.Row(i)*y.Column(j), c[i, j], 15); } } + } - /// - /// Can multiply two square matrices. - /// - [Test] - public void CanMultiplySquareMatricesWithUpdate() - { - var x = _matrices["Singular3x3"]; - var y = _matrices["Square3x3"]; - var c = new DenseMatrix(x.RowCount, y.ColumnCount); + /// + /// Can multiply two square matrices. + /// + [Test] + public void CanMultiplySquareMatricesWithUpdate() + { + var x = _matrices["Singular3x3"]; + var y = _matrices["Square3x3"]; + var c = new DenseMatrix(x.RowCount, y.ColumnCount); - Control.LinearAlgebraProvider.MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.DontTranspose, 2.2, x.Values, x.RowCount, x.ColumnCount, y.Values, y.RowCount, y.ColumnCount, 1.0, c.Values); + Control.LinearAlgebraProvider.MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.DontTranspose, 2.2, x.Values, x.RowCount, x.ColumnCount, y.Values, y.RowCount, y.ColumnCount, 1.0, c.Values); - for (var i = 0; i < c.RowCount; i++) + for (var i = 0; i < c.RowCount; i++) + { + for (var j = 0; j < c.ColumnCount; j++) { - for (var j = 0; j < c.ColumnCount; j++) - { - AssertHelpers.AlmostEqual(2.2 * x.Row(i) * y.Column(j), c[i, j], 15); - } + AssertHelpers.AlmostEqual(2.2*x.Row(i)*y.Column(j), c[i, j], 15); } } + } - /// - /// Can multiply a wide and tall matrix. - /// - [Test] - public void CanMultiplyWideAndTallMatricesWithUpdate() - { - var x = _matrices["Wide2x3"]; - var y = _matrices["Tall3x2"]; - var c = new DenseMatrix(x.RowCount, y.ColumnCount); + /// + /// Can multiply a wide and tall matrix. + /// + [Test] + public void CanMultiplyWideAndTallMatricesWithUpdate() + { + var x = _matrices["Wide2x3"]; + var y = _matrices["Tall3x2"]; + var c = new DenseMatrix(x.RowCount, y.ColumnCount); - Control.LinearAlgebraProvider.MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.DontTranspose, 2.2, x.Values, x.RowCount, x.ColumnCount, y.Values, y.RowCount, y.ColumnCount, 1.0, c.Values); + Control.LinearAlgebraProvider.MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.DontTranspose, 2.2, x.Values, x.RowCount, x.ColumnCount, y.Values, y.RowCount, y.ColumnCount, 1.0, c.Values); - for (var i = 0; i < c.RowCount; i++) + for (var i = 0; i < c.RowCount; i++) + { + for (var j = 0; j < c.ColumnCount; j++) { - for (var j = 0; j < c.ColumnCount; j++) - { - AssertHelpers.AlmostEqual(2.2 * x.Row(i) * y.Column(j), c[i, j], 15); - } + AssertHelpers.AlmostEqual(2.2*x.Row(i)*y.Column(j), c[i, j], 15); } } + } - /// - /// Can multiply a tall and wide matrix. - /// - [Test] - public void CanMultiplyTallAndWideMatricesWithUpdate() - { - var x = _matrices["Tall3x2"]; - var y = _matrices["Wide2x3"]; - var c = new DenseMatrix(x.RowCount, y.ColumnCount); + /// + /// Can multiply a tall and wide matrix. + /// + [Test] + public void CanMultiplyTallAndWideMatricesWithUpdate() + { + var x = _matrices["Tall3x2"]; + var y = _matrices["Wide2x3"]; + var c = new DenseMatrix(x.RowCount, y.ColumnCount); - Control.LinearAlgebraProvider.MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.DontTranspose, 2.2, x.Values, x.RowCount, x.ColumnCount, y.Values, y.RowCount, y.ColumnCount, 1.0, c.Values); + Control.LinearAlgebraProvider.MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.DontTranspose, 2.2, x.Values, x.RowCount, x.ColumnCount, y.Values, y.RowCount, y.ColumnCount, 1.0, c.Values); - for (var i = 0; i < c.RowCount; i++) + for (var i = 0; i < c.RowCount; i++) + { + for (var j = 0; j < c.ColumnCount; j++) { - for (var j = 0; j < c.ColumnCount; j++) - { - AssertHelpers.AlmostEqual(2.2 * x.Row(i) * y.Column(j), c[i, j], 15); - } + AssertHelpers.AlmostEqual(2.2*x.Row(i)*y.Column(j), c[i, j], 15); } } + } - /// - /// Can compute the LU factor of a matrix. - /// - [Test] - public void CanComputeLuFactor() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.RowCount]; - Array.Copy(matrix.Values, a, a.Length); - - var ipiv = new int[matrix.RowCount]; - - Control.LinearAlgebraProvider.LUFactor(a, matrix.RowCount, ipiv); - - AssertHelpers.AlmostEqual(a[0], -4.4, 15); - AssertHelpers.AlmostEqual(a[1], 0.25, 15); - AssertHelpers.AlmostEqual(a[2], 0, 15); - AssertHelpers.AlmostEqual(a[3], 5.5, 15); - AssertHelpers.AlmostEqual(a[4], -3.575, 15); - AssertHelpers.AlmostEqual(a[5], -0.307692307692308, 15); - AssertHelpers.AlmostEqual(a[6], 6.6, 15); - AssertHelpers.AlmostEqual(a[7], -4.95, 15); - AssertHelpers.AlmostEqual(a[8], 0.676923076923077, 15); - Assert.AreEqual(ipiv[0], 2); - Assert.AreEqual(ipiv[1], 2); - Assert.AreEqual(ipiv[2], 2); - } + /// + /// Can compute the LU factor of a matrix. + /// + [Test] + public void CanComputeLuFactor() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.RowCount]; + Array.Copy(matrix.Values, a, a.Length); + + var ipiv = new int[matrix.RowCount]; + + Control.LinearAlgebraProvider.LUFactor(a, matrix.RowCount, ipiv); + + AssertHelpers.AlmostEqual(a[0], -4.4, 15); + AssertHelpers.AlmostEqual(a[1], 0.25, 15); + AssertHelpers.AlmostEqual(a[2], 0, 15); + AssertHelpers.AlmostEqual(a[3], 5.5, 15); + AssertHelpers.AlmostEqual(a[4], -3.575, 15); + AssertHelpers.AlmostEqual(a[5], -0.307692307692308, 15); + AssertHelpers.AlmostEqual(a[6], 6.6, 15); + AssertHelpers.AlmostEqual(a[7], -4.95, 15); + AssertHelpers.AlmostEqual(a[8], 0.676923076923077, 15); + Assert.AreEqual(ipiv[0], 2); + Assert.AreEqual(ipiv[1], 2); + Assert.AreEqual(ipiv[2], 2); + } - /// - /// Can compute the inverse of a matrix using LU factorization. - /// - [Test] - public void CanComputeLuInverse() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.RowCount]; - Array.Copy(matrix.Values, a, a.Length); - - Control.LinearAlgebraProvider.LUInverse(a, matrix.RowCount); - - AssertHelpers.AlmostEqual(a[0], -0.454545454545454, 14); - AssertHelpers.AlmostEqual(a[1], -0.909090909090908, 14); - AssertHelpers.AlmostEqual(a[2], 0.454545454545454, 14); - AssertHelpers.AlmostEqual(a[3], -0.340909090909090, 14); - AssertHelpers.AlmostEqual(a[4], -2.045454545454543, 14); - AssertHelpers.AlmostEqual(a[5], 1.477272727272726, 14); - AssertHelpers.AlmostEqual(a[6], -0.113636363636364, 14); - AssertHelpers.AlmostEqual(a[7], 0.227272727272727, 14); - AssertHelpers.AlmostEqual(a[8], -0.113636363636364, 14); - } + /// + /// Can compute the inverse of a matrix using LU factorization. + /// + [Test] + public void CanComputeLuInverse() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.RowCount]; + Array.Copy(matrix.Values, a, a.Length); + + Control.LinearAlgebraProvider.LUInverse(a, matrix.RowCount); + + AssertHelpers.AlmostEqual(a[0], -0.454545454545454, 14); + AssertHelpers.AlmostEqual(a[1], -0.909090909090908, 14); + AssertHelpers.AlmostEqual(a[2], 0.454545454545454, 14); + AssertHelpers.AlmostEqual(a[3], -0.340909090909090, 14); + AssertHelpers.AlmostEqual(a[4], -2.045454545454543, 14); + AssertHelpers.AlmostEqual(a[5], 1.477272727272726, 14); + AssertHelpers.AlmostEqual(a[6], -0.113636363636364, 14); + AssertHelpers.AlmostEqual(a[7], 0.227272727272727, 14); + AssertHelpers.AlmostEqual(a[8], -0.113636363636364, 14); + } - /// - /// Can compute the inverse of a matrix using LU factorization - /// using a previously factored matrix. - /// - [Test] - public void CanComputeLuInverseOnFactoredMatrix() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.RowCount]; - Array.Copy(matrix.Values, a, a.Length); - - var ipiv = new int[matrix.RowCount]; - - Control.LinearAlgebraProvider.LUFactor(a, matrix.RowCount, ipiv); - Control.LinearAlgebraProvider.LUInverseFactored(a, matrix.RowCount, ipiv); - - AssertHelpers.AlmostEqual(a[0], -0.454545454545454, 14); - AssertHelpers.AlmostEqual(a[1], -0.909090909090908, 14); - AssertHelpers.AlmostEqual(a[2], 0.454545454545454, 14); - AssertHelpers.AlmostEqual(a[3], -0.340909090909090, 14); - AssertHelpers.AlmostEqual(a[4], -2.045454545454543, 14); - AssertHelpers.AlmostEqual(a[5], 1.477272727272726, 14); - AssertHelpers.AlmostEqual(a[6], -0.113636363636364, 14); - AssertHelpers.AlmostEqual(a[7], 0.227272727272727, 14); - AssertHelpers.AlmostEqual(a[8], -0.113636363636364, 14); - } + /// + /// Can compute the inverse of a matrix using LU factorization + /// using a previously factored matrix. + /// + [Test] + public void CanComputeLuInverseOnFactoredMatrix() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.RowCount]; + Array.Copy(matrix.Values, a, a.Length); + + var ipiv = new int[matrix.RowCount]; + + Control.LinearAlgebraProvider.LUFactor(a, matrix.RowCount, ipiv); + Control.LinearAlgebraProvider.LUInverseFactored(a, matrix.RowCount, ipiv); + + AssertHelpers.AlmostEqual(a[0], -0.454545454545454, 14); + AssertHelpers.AlmostEqual(a[1], -0.909090909090908, 14); + AssertHelpers.AlmostEqual(a[2], 0.454545454545454, 14); + AssertHelpers.AlmostEqual(a[3], -0.340909090909090, 14); + AssertHelpers.AlmostEqual(a[4], -2.045454545454543, 14); + AssertHelpers.AlmostEqual(a[5], 1.477272727272726, 14); + AssertHelpers.AlmostEqual(a[6], -0.113636363636364, 14); + AssertHelpers.AlmostEqual(a[7], 0.227272727272727, 14); + AssertHelpers.AlmostEqual(a[8], -0.113636363636364, 14); + } - /// - /// Can compute the inverse of a matrix using LU factorization - /// with a work array. - /// - [Test] - public void CanComputeLuInverseWithWorkArray() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.RowCount]; - Array.Copy(matrix.Values, a, a.Length); - - var work = new double[matrix.RowCount]; - Control.LinearAlgebraProvider.LUInverse(a, matrix.RowCount, work); - - AssertHelpers.AlmostEqual(a[0], -0.454545454545454, 14); - AssertHelpers.AlmostEqual(a[1], -0.909090909090908, 14); - AssertHelpers.AlmostEqual(a[2], 0.454545454545454, 14); - AssertHelpers.AlmostEqual(a[3], -0.340909090909090, 14); - AssertHelpers.AlmostEqual(a[4], -2.045454545454543, 14); - AssertHelpers.AlmostEqual(a[5], 1.477272727272726, 14); - AssertHelpers.AlmostEqual(a[6], -0.113636363636364, 14); - AssertHelpers.AlmostEqual(a[7], 0.227272727272727, 14); - AssertHelpers.AlmostEqual(a[8], -0.113636363636364, 14); - } + /// + /// Can compute the inverse of a matrix using LU factorization + /// with a work array. + /// + [Test] + public void CanComputeLuInverseWithWorkArray() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.RowCount]; + Array.Copy(matrix.Values, a, a.Length); + + var work = new double[matrix.RowCount]; + Control.LinearAlgebraProvider.LUInverse(a, matrix.RowCount, work); + + AssertHelpers.AlmostEqual(a[0], -0.454545454545454, 14); + AssertHelpers.AlmostEqual(a[1], -0.909090909090908, 14); + AssertHelpers.AlmostEqual(a[2], 0.454545454545454, 14); + AssertHelpers.AlmostEqual(a[3], -0.340909090909090, 14); + AssertHelpers.AlmostEqual(a[4], -2.045454545454543, 14); + AssertHelpers.AlmostEqual(a[5], 1.477272727272726, 14); + AssertHelpers.AlmostEqual(a[6], -0.113636363636364, 14); + AssertHelpers.AlmostEqual(a[7], 0.227272727272727, 14); + AssertHelpers.AlmostEqual(a[8], -0.113636363636364, 14); + } - /// - /// Can compute the inverse of a matrix using LU factorization - /// using a previously factored matrix with a work array. - /// - [Test] - public void CanComputeLuInverseOnFactoredMatrixWithWorkArray() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.RowCount]; - Array.Copy(matrix.Values, a, a.Length); - - var ipiv = new int[matrix.RowCount]; - - Control.LinearAlgebraProvider.LUFactor(a, matrix.RowCount, ipiv); - - var work = new double[matrix.RowCount]; - Control.LinearAlgebraProvider.LUInverseFactored(a, matrix.RowCount, ipiv, work); - - AssertHelpers.AlmostEqual(a[0], -0.454545454545454, 14); - AssertHelpers.AlmostEqual(a[1], -0.909090909090908, 14); - AssertHelpers.AlmostEqual(a[2], 0.454545454545454, 14); - AssertHelpers.AlmostEqual(a[3], -0.340909090909090, 14); - AssertHelpers.AlmostEqual(a[4], -2.045454545454543, 14); - AssertHelpers.AlmostEqual(a[5], 1.477272727272726, 14); - AssertHelpers.AlmostEqual(a[6], -0.113636363636364, 14); - AssertHelpers.AlmostEqual(a[7], 0.227272727272727, 14); - AssertHelpers.AlmostEqual(a[8], -0.113636363636364, 14); - } + /// + /// Can compute the inverse of a matrix using LU factorization + /// using a previously factored matrix with a work array. + /// + [Test] + public void CanComputeLuInverseOnFactoredMatrixWithWorkArray() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.RowCount]; + Array.Copy(matrix.Values, a, a.Length); + + var ipiv = new int[matrix.RowCount]; + + Control.LinearAlgebraProvider.LUFactor(a, matrix.RowCount, ipiv); + + var work = new double[matrix.RowCount]; + Control.LinearAlgebraProvider.LUInverseFactored(a, matrix.RowCount, ipiv, work); + + AssertHelpers.AlmostEqual(a[0], -0.454545454545454, 14); + AssertHelpers.AlmostEqual(a[1], -0.909090909090908, 14); + AssertHelpers.AlmostEqual(a[2], 0.454545454545454, 14); + AssertHelpers.AlmostEqual(a[3], -0.340909090909090, 14); + AssertHelpers.AlmostEqual(a[4], -2.045454545454543, 14); + AssertHelpers.AlmostEqual(a[5], 1.477272727272726, 14); + AssertHelpers.AlmostEqual(a[6], -0.113636363636364, 14); + AssertHelpers.AlmostEqual(a[7], 0.227272727272727, 14); + AssertHelpers.AlmostEqual(a[8], -0.113636363636364, 14); + } - /// - /// Can solve Ax=b using LU factorization. - /// - [Test] - public void CanSolveUsingLU() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.RowCount]; - Array.Copy(matrix.Values, a, a.Length); + /// + /// Can solve Ax=b using LU factorization. + /// + [Test] + public void CanSolveUsingLU() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.RowCount]; + Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - Control.LinearAlgebraProvider.LUSolve(2, a, matrix.RowCount, b); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + Control.LinearAlgebraProvider.LUSolve(2, a, matrix.RowCount, b); - AssertHelpers.AlmostEqual(b[0], -1.477272727272726, 14); - AssertHelpers.AlmostEqual(b[1], -4.318181818181815, 14); - AssertHelpers.AlmostEqual(b[2], 3.068181818181816, 14); - AssertHelpers.AlmostEqual(b[3], -4.204545454545451, 14); - AssertHelpers.AlmostEqual(b[4], -12.499999999999989, 14); - AssertHelpers.AlmostEqual(b[5], 8.522727272727266, 14); + AssertHelpers.AlmostEqual(b[0], -1.477272727272726, 14); + AssertHelpers.AlmostEqual(b[1], -4.318181818181815, 14); + AssertHelpers.AlmostEqual(b[2], 3.068181818181816, 14); + AssertHelpers.AlmostEqual(b[3], -4.204545454545451, 14); + AssertHelpers.AlmostEqual(b[4], -12.499999999999989, 14); + AssertHelpers.AlmostEqual(b[5], 8.522727272727266, 14); - NotModified(matrix.RowCount, matrix.ColumnCount, a, matrix); - } + NotModified(matrix.RowCount, matrix.ColumnCount, a, matrix); + } - /// - /// Can solve Ax=b using LU factorization using a factored matrix. - /// - [Test] - public void CanSolveUsingLUOnFactoredMatrix() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.RowCount]; - Array.Copy(matrix.Values, a, a.Length); - - var ipiv = new int[matrix.RowCount]; - Control.LinearAlgebraProvider.LUFactor(a, matrix.RowCount, ipiv); - - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - Control.LinearAlgebraProvider.LUSolveFactored(2, a, matrix.RowCount, ipiv, b); - - AssertHelpers.AlmostEqual(b[0], -1.477272727272726, 14); - AssertHelpers.AlmostEqual(b[1], -4.318181818181815, 14); - AssertHelpers.AlmostEqual(b[2], 3.068181818181816, 14); - AssertHelpers.AlmostEqual(b[3], -4.204545454545451, 14); - AssertHelpers.AlmostEqual(b[4], -12.499999999999989, 14); - AssertHelpers.AlmostEqual(b[5], 8.522727272727266, 14); - } + /// + /// Can solve Ax=b using LU factorization using a factored matrix. + /// + [Test] + public void CanSolveUsingLUOnFactoredMatrix() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.RowCount]; + Array.Copy(matrix.Values, a, a.Length); + + var ipiv = new int[matrix.RowCount]; + Control.LinearAlgebraProvider.LUFactor(a, matrix.RowCount, ipiv); + + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + Control.LinearAlgebraProvider.LUSolveFactored(2, a, matrix.RowCount, ipiv, b); + + AssertHelpers.AlmostEqual(b[0], -1.477272727272726, 14); + AssertHelpers.AlmostEqual(b[1], -4.318181818181815, 14); + AssertHelpers.AlmostEqual(b[2], 3.068181818181816, 14); + AssertHelpers.AlmostEqual(b[3], -4.204545454545451, 14); + AssertHelpers.AlmostEqual(b[4], -12.499999999999989, 14); + AssertHelpers.AlmostEqual(b[5], 8.522727272727266, 14); + } - /// - /// Can compute the Cholesky factorization. - /// - [Test] - public void CanComputeCholeskyFactor() - { - var matrix = new double[] { 1, 1, 1, 1, 1, 5, 5, 5, 1, 5, 14, 14, 1, 5, 14, 15 }; - Control.LinearAlgebraProvider.CholeskyFactor(matrix, 4); - Assert.AreEqual(matrix[0], 1); - Assert.AreEqual(matrix[1], 1); - Assert.AreEqual(matrix[2], 1); - Assert.AreEqual(matrix[3], 1); - Assert.AreEqual(matrix[4], 0); - Assert.AreEqual(matrix[5], 2); - Assert.AreEqual(matrix[6], 2); - Assert.AreEqual(matrix[7], 2); - Assert.AreEqual(matrix[8], 0); - Assert.AreEqual(matrix[9], 0); - Assert.AreEqual(matrix[10], 3); - Assert.AreEqual(matrix[11], 3); - Assert.AreEqual(matrix[12], 0); - Assert.AreEqual(matrix[13], 0); - Assert.AreEqual(matrix[14], 0); - Assert.AreEqual(matrix[15], 1); - } + /// + /// Can compute the Cholesky factorization. + /// + [Test] + public void CanComputeCholeskyFactor() + { + var matrix = new double[] {1, 1, 1, 1, 1, 5, 5, 5, 1, 5, 14, 14, 1, 5, 14, 15}; + Control.LinearAlgebraProvider.CholeskyFactor(matrix, 4); + Assert.AreEqual(matrix[0], 1); + Assert.AreEqual(matrix[1], 1); + Assert.AreEqual(matrix[2], 1); + Assert.AreEqual(matrix[3], 1); + Assert.AreEqual(matrix[4], 0); + Assert.AreEqual(matrix[5], 2); + Assert.AreEqual(matrix[6], 2); + Assert.AreEqual(matrix[7], 2); + Assert.AreEqual(matrix[8], 0); + Assert.AreEqual(matrix[9], 0); + Assert.AreEqual(matrix[10], 3); + Assert.AreEqual(matrix[11], 3); + Assert.AreEqual(matrix[12], 0); + Assert.AreEqual(matrix[13], 0); + Assert.AreEqual(matrix[14], 0); + Assert.AreEqual(matrix[15], 1); + } - /// - /// Can solve Ax=b using Cholesky factorization. - /// - [Test] - public void CanSolveUsingCholesky() - { - var matrix = new DenseMatrix(3, 3, new double[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 }); - var a = new double[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 }; + /// + /// Can solve Ax=b using Cholesky factorization. + /// + [Test] + public void CanSolveUsingCholesky() + { + var matrix = new DenseMatrix(3, 3, new double[] {1, 1, 1, 1, 2, 3, 1, 3, 6}); + var a = new double[] {1, 1, 1, 1, 2, 3, 1, 3, 6}; - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - Control.LinearAlgebraProvider.CholeskySolve(a, 3, b, 2); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + Control.LinearAlgebraProvider.CholeskySolve(a, 3, b, 2); - AssertHelpers.AlmostEqual(b[0], 0, 14); - AssertHelpers.AlmostEqual(b[1], 1, 14); - AssertHelpers.AlmostEqual(b[2], 0, 14); - AssertHelpers.AlmostEqual(b[3], 3, 14); - AssertHelpers.AlmostEqual(b[4], 1, 14); - AssertHelpers.AlmostEqual(b[5], 0, 14); + AssertHelpers.AlmostEqual(b[0], 0, 14); + AssertHelpers.AlmostEqual(b[1], 1, 14); + AssertHelpers.AlmostEqual(b[2], 0, 14); + AssertHelpers.AlmostEqual(b[3], 3, 14); + AssertHelpers.AlmostEqual(b[4], 1, 14); + AssertHelpers.AlmostEqual(b[5], 0, 14); - NotModified(3, 3, a, matrix); - } + NotModified(3, 3, a, matrix); + } - /// - /// Can solve Ax=b using LU factorization using a factored matrix. - /// - [Test] - public void CanSolveUsingCholeskyOnFactoredMatrix() - { - var a = new double[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 }; + /// + /// Can solve Ax=b using LU factorization using a factored matrix. + /// + [Test] + public void CanSolveUsingCholeskyOnFactoredMatrix() + { + var a = new double[] {1, 1, 1, 1, 2, 3, 1, 3, 6}; - Control.LinearAlgebraProvider.CholeskyFactor(a, 3); + Control.LinearAlgebraProvider.CholeskyFactor(a, 3); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - Control.LinearAlgebraProvider.CholeskySolveFactored(a, 3, b, 2); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + Control.LinearAlgebraProvider.CholeskySolveFactored(a, 3, b, 2); - AssertHelpers.AlmostEqual(b[0], 0, 14); - AssertHelpers.AlmostEqual(b[1], 1, 14); - AssertHelpers.AlmostEqual(b[2], 0, 14); - AssertHelpers.AlmostEqual(b[3], 3, 14); - AssertHelpers.AlmostEqual(b[4], 1, 14); - AssertHelpers.AlmostEqual(b[5], 0, 14); - } + AssertHelpers.AlmostEqual(b[0], 0, 14); + AssertHelpers.AlmostEqual(b[1], 1, 14); + AssertHelpers.AlmostEqual(b[2], 0, 14); + AssertHelpers.AlmostEqual(b[3], 3, 14); + AssertHelpers.AlmostEqual(b[4], 1, 14); + AssertHelpers.AlmostEqual(b[5], 0, 14); + } - /// - /// Can compute QR factorization of a square matrix. - /// - [Test] - public void CanComputeQRFactorSquareMatrix() - { - var matrix = _matrices["Square3x3"]; - var r = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, r, r.Length); + /// + /// Can compute QR factorization of a square matrix. + /// + [Test] + public void CanComputeQRFactorSquareMatrix() + { + var matrix = _matrices["Square3x3"]; + var r = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, r, r.Length); - var tau = new double[3]; - var q = new double[matrix.RowCount * matrix.RowCount]; - Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); + var tau = new double[3]; + var q = new double[matrix.RowCount*matrix.RowCount]; + Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); - var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); - var a = mq * mr; + var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); + var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); + var a = mq*mr; - for (var row = 0; row < matrix.RowCount; row++) + for (var row = 0; row < matrix.RowCount; row++) + { + for (var col = 0; col < matrix.ColumnCount; col++) { - for (var col = 0; col < matrix.ColumnCount; col++) - { - AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); - } + AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); } } + } - /// - /// Can compute QR factorization of a tall matrix. - /// - [Test] - public void CanComputeQRFactorTallMatrix() - { - var matrix = _matrices["Tall3x2"]; - var r = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, r, r.Length); + /// + /// Can compute QR factorization of a tall matrix. + /// + [Test] + public void CanComputeQRFactorTallMatrix() + { + var matrix = _matrices["Tall3x2"]; + var r = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, r, r.Length); - var tau = new double[3]; - var q = new double[matrix.RowCount * matrix.RowCount]; - Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); + var tau = new double[3]; + var q = new double[matrix.RowCount*matrix.RowCount]; + Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); - var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); - var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); + var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); + var a = mq*mr; - for (var row = 0; row < matrix.RowCount; row++) + for (var row = 0; row < matrix.RowCount; row++) + { + for (var col = 0; col < matrix.ColumnCount; col++) { - for (var col = 0; col < matrix.ColumnCount; col++) - { - AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); - } + AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); } } + } - /// - /// Can compute QR factorization of a wide matrix. - /// - [Test] - public void CanComputeQRFactorWideMatrix() - { - var matrix = _matrices["Wide2x3"]; - var r = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, r, r.Length); + /// + /// Can compute QR factorization of a wide matrix. + /// + [Test] + public void CanComputeQRFactorWideMatrix() + { + var matrix = _matrices["Wide2x3"]; + var r = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, r, r.Length); - var tau = new double[3]; - var q = new double[matrix.RowCount * matrix.RowCount]; - Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); + var tau = new double[3]; + var q = new double[matrix.RowCount*matrix.RowCount]; + Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); - var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); - var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); + var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); + var a = mq*mr; - for (var row = 0; row < matrix.RowCount; row++) + for (var row = 0; row < matrix.RowCount; row++) + { + for (var col = 0; col < matrix.ColumnCount; col++) { - for (var col = 0; col < matrix.ColumnCount; col++) - { - AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); - } + AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); } } + } - /// - /// Can compute QR factorization of a square matrix using a work array. - /// - [Test] - public void CanComputeQRFactorSquareMatrixWithWorkArray() - { - var matrix = _matrices["Square3x3"]; - var r = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, r, r.Length); + /// + /// Can compute QR factorization of a square matrix using a work array. + /// + [Test] + public void CanComputeQRFactorSquareMatrixWithWorkArray() + { + var matrix = _matrices["Square3x3"]; + var r = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, r, r.Length); - var tau = new double[3]; - var q = new double[matrix.RowCount * matrix.RowCount]; - var work = new double[matrix.ColumnCount * Control.BlockSize]; - Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); + var tau = new double[3]; + var q = new double[matrix.RowCount*matrix.RowCount]; + var work = new double[matrix.ColumnCount*Control.BlockSize]; + Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); - var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); - var a = mq * mr; + var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); + var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); + var a = mq*mr; - for (var row = 0; row < matrix.RowCount; row++) + for (var row = 0; row < matrix.RowCount; row++) + { + for (var col = 0; col < matrix.ColumnCount; col++) { - for (var col = 0; col < matrix.ColumnCount; col++) - { - AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); - } + AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); } } + } - /// - /// Can compute QR factorization of a tall matrix using a work matrix. - /// - [Test] - public void CanComputeQRFactorTallMatrixWithWorkArray() - { - var matrix = _matrices["Tall3x2"]; - var r = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, r, r.Length); + /// + /// Can compute QR factorization of a tall matrix using a work matrix. + /// + [Test] + public void CanComputeQRFactorTallMatrixWithWorkArray() + { + var matrix = _matrices["Tall3x2"]; + var r = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, r, r.Length); - var tau = new double[3]; - var q = new double[matrix.RowCount * matrix.RowCount]; - var work = new double[matrix.ColumnCount * Control.BlockSize]; - Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); + var tau = new double[3]; + var q = new double[matrix.RowCount*matrix.RowCount]; + var work = new double[matrix.ColumnCount*Control.BlockSize]; + Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); - var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); - var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); + var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); + var a = mq*mr; - for (var row = 0; row < matrix.RowCount; row++) + for (var row = 0; row < matrix.RowCount; row++) + { + for (var col = 0; col < matrix.ColumnCount; col++) { - for (var col = 0; col < matrix.ColumnCount; col++) - { - AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); - } + AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); } } + } - /// - /// Can compute QR factorization of a wide matrix using a work matrix. - /// - [Test] - public void CanComputeQRFactorWideMatrixWithWorkArray() - { - var matrix = _matrices["Wide2x3"]; - var r = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, r, r.Length); + /// + /// Can compute QR factorization of a wide matrix using a work matrix. + /// + [Test] + public void CanComputeQRFactorWideMatrixWithWorkArray() + { + var matrix = _matrices["Wide2x3"]; + var r = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, r, r.Length); - var tau = new double[3]; - var q = new double[matrix.RowCount * matrix.RowCount]; - var work = new double[matrix.ColumnCount * Control.BlockSize]; - Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); + var tau = new double[3]; + var q = new double[matrix.RowCount*matrix.RowCount]; + var work = new double[matrix.ColumnCount*Control.BlockSize]; + Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); - var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); - var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); + var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); + var a = mq*mr; - for (var row = 0; row < matrix.RowCount; row++) + for (var row = 0; row < matrix.RowCount; row++) + { + for (var col = 0; col < matrix.ColumnCount; col++) { - for (var col = 0; col < matrix.ColumnCount; col++) - { - AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); - } + AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); } } + } - /// - /// Can compute thin QR factorization of a square matrix. - /// - [Test] - public void CanComputeThinQRFactorSquareMatrix() - { - var matrix = _matrices["Square3x3"]; - var r = new double[matrix.ColumnCount * matrix.ColumnCount]; - var tau = new double[3]; - var q = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, q, q.Length); + /// + /// Can compute thin QR factorization of a square matrix. + /// + [Test] + public void CanComputeThinQRFactorSquareMatrix() + { + var matrix = _matrices["Square3x3"]; + var r = new double[matrix.ColumnCount*matrix.ColumnCount]; + var tau = new double[3]; + var q = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, q, q.Length); - Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau); + Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau); - var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); - var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); + var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); + var a = mq*mr; - for (var row = 0; row < matrix.RowCount; row++) + for (var row = 0; row < matrix.RowCount; row++) + { + for (var col = 0; col < matrix.ColumnCount; col++) { - for (var col = 0; col < matrix.ColumnCount; col++) - { - AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); - } + AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); } } + } - /// - /// Can compute thin QR factorization of a tall matrix. - /// - [Test] - public void CanComputeThinQRFactorTallMatrix() - { - var matrix = _matrices["Tall3x2"]; - var r = new double[matrix.ColumnCount * matrix.ColumnCount]; - var tau = new double[3]; - var q = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, q, q.Length); + /// + /// Can compute thin QR factorization of a tall matrix. + /// + [Test] + public void CanComputeThinQRFactorTallMatrix() + { + var matrix = _matrices["Tall3x2"]; + var r = new double[matrix.ColumnCount*matrix.ColumnCount]; + var tau = new double[3]; + var q = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, q, q.Length); - Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau); + Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau); - var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); - var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); + var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); + var a = mq*mr; - for (var row = 0; row < matrix.RowCount; row++) + for (var row = 0; row < matrix.RowCount; row++) + { + for (var col = 0; col < matrix.ColumnCount; col++) { - for (var col = 0; col < matrix.ColumnCount; col++) - { - AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); - } + AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); } } + } - /// - /// Can compute thin QR factorization of a square matrix using a work array. - /// - [Test] - public void CanComputeThinQRFactorSquareMatrixWithWorkArray() - { - var matrix = _matrices["Square3x3"]; - var r = new double[matrix.ColumnCount * matrix.ColumnCount]; - var tau = new double[3]; - var q = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, q, q.Length); + /// + /// Can compute thin QR factorization of a square matrix using a work array. + /// + [Test] + public void CanComputeThinQRFactorSquareMatrixWithWorkArray() + { + var matrix = _matrices["Square3x3"]; + var r = new double[matrix.ColumnCount*matrix.ColumnCount]; + var tau = new double[3]; + var q = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, q, q.Length); - var work = new double[matrix.ColumnCount * Control.BlockSize]; - Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau, work); + var work = new double[matrix.ColumnCount*Control.BlockSize]; + Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau, work); - var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); - var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); + var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); + var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var a = mq*mr; - for (var row = 0; row < matrix.RowCount; row++) + for (var row = 0; row < matrix.RowCount; row++) + { + for (var col = 0; col < matrix.ColumnCount; col++) { - for (var col = 0; col < matrix.ColumnCount; col++) - { - AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); - } + AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); } } + } - /// - /// Can compute thin QR factorization of a tall matrix using a work matrix. - /// - [Test] - public void CanComputeThinQRFactorTallMatrixWithWorkArray() + /// + /// Can compute thin QR factorization of a tall matrix using a work matrix. + /// + [Test] + public void CanComputeThinQRFactorTallMatrixWithWorkArray() + { + var matrix = _matrices["Tall3x2"]; + var r = new double[matrix.ColumnCount*matrix.ColumnCount]; + var tau = new double[3]; + var q = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, q, q.Length); + + var work = new double[matrix.ColumnCount*Control.BlockSize]; + Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau, work); + + var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); + var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); + var a = mq*mr; + for (var row = 0; row < matrix.RowCount; row++) { - var matrix = _matrices["Tall3x2"]; - var r = new double[matrix.ColumnCount * matrix.ColumnCount]; - var tau = new double[3]; - var q = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, q, q.Length); - - var work = new double[matrix.ColumnCount * Control.BlockSize]; - Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau, work); - - var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); - var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; - for (var row = 0; row < matrix.RowCount; row++) + for (var col = 0; col < matrix.ColumnCount; col++) { - for (var col = 0; col < matrix.ColumnCount; col++) - { - AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); - } + AssertHelpers.AlmostEqual(matrix[row, col], a[row, col], 14); } } + } - /// - /// Can solve Ax=b using QR factorization with a square A matrix. - /// - [Test] - public void CanSolveUsingQRSquareMatrix() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + /// + /// Can solve Ax=b using QR factorization with a square A matrix. + /// + [Test] + public void CanSolveUsingQRSquareMatrix() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); - NotModified(3, 3, a, matrix); + NotModified(3, 3, a, matrix); - var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mx = new DenseMatrix(matrix.ColumnCount, 2, x); + var mb = matrix*mx; - AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); - AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); - AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); - AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); - AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); - AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); - } + AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); + AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); + AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); + AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); + AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); + AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); + } - /// - /// Can solve Ax=b using QR factorization with a tall A matrix. - /// - [Test] - public void CanSolveUsingQRTallMatrix() - { - var matrix = _matrices["Tall3x2"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + /// + /// Can solve Ax=b using QR factorization with a tall A matrix. + /// + [Test] + public void CanSolveUsingQRTallMatrix() + { + var matrix = _matrices["Tall3x2"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); - NotModified(3, 2, a, matrix); + NotModified(3, 2, a, matrix); - var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var mb = new DenseMatrix(matrix.RowCount, 2, b); + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; - AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); - AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); - AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); - AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); - } + AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); + AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); + AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); + AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); + } - /// - /// Can solve Ax=b using QR factorization with a square A matrix - /// using a work array. - /// - [Test] - public void CanSolveUsingQRSquareMatrixUsingWorkArray() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); - - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - var work = new double[matrix.RowCount * Control.BlockSize]; - Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work); - - NotModified(3, 3, a, matrix); - - var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; - - AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); - AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); - AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); - AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); - AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); - AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); - } + /// + /// Can solve Ax=b using QR factorization with a square A matrix + /// using a work array. + /// + [Test] + public void CanSolveUsingQRSquareMatrixUsingWorkArray() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); + + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + var work = new double[matrix.RowCount*Control.BlockSize]; + Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work); + + NotModified(3, 3, a, matrix); + + var mx = new DenseMatrix(matrix.ColumnCount, 2, x); + var mb = matrix*mx; + + AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); + AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); + AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); + AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); + AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); + AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); + } - /// - /// Can solve Ax=b using QR factorization with a tall A matrix - /// using a work array. - /// - [Test] - public void CanSolveUsingQRTallMatrixUsingWorkArray() - { - var matrix = _matrices["Tall3x2"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + /// + /// Can solve Ax=b using QR factorization with a tall A matrix + /// using a work array. + /// + [Test] + public void CanSolveUsingQRTallMatrixUsingWorkArray() + { + var matrix = _matrices["Tall3x2"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - var work = new double[matrix.RowCount * matrix.RowCount]; - Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + var work = new double[matrix.RowCount*matrix.RowCount]; + Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work); - NotModified(3, 2, a, matrix); + NotModified(3, 2, a, matrix); - var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var mb = new DenseMatrix(matrix.RowCount, 2, b); + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; - AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); - AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); - AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); - AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); - } + AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); + AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); + AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); + AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); + } - /// - /// Can solve Ax=b using QR factorization with a square A matrix - /// using a factored A matrix. - /// - [Test] - public void CanSolveUsingQRSquareMatrixOnFactoredMatrix() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.RowCount]; - Array.Copy(matrix.Values, a, a.Length); - - var tau = new double[matrix.ColumnCount]; - var q = new double[matrix.ColumnCount * matrix.ColumnCount]; - Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau); - - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x); - - var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; - - AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); - AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); - AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); - AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); - AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); - AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); - } + /// + /// Can solve Ax=b using QR factorization with a square A matrix + /// using a factored A matrix. + /// + [Test] + public void CanSolveUsingQRSquareMatrixOnFactoredMatrix() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.RowCount]; + Array.Copy(matrix.Values, a, a.Length); + + var tau = new double[matrix.ColumnCount]; + var q = new double[matrix.ColumnCount*matrix.ColumnCount]; + Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau); + + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x); + + var mx = new DenseMatrix(matrix.ColumnCount, 2, x); + var mb = matrix*mx; + + AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); + AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); + AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); + AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); + AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); + AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); + } - /// - /// Can solve Ax=b using QR factorization with a tall A matrix - /// using a factored A matrix. - /// - [Test] - public void CanSolveUsingQRTallMatrixOnFactoredMatrix() - { - var matrix = _matrices["Tall3x2"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + /// + /// Can solve Ax=b using QR factorization with a tall A matrix + /// using a factored A matrix. + /// + [Test] + public void CanSolveUsingQRTallMatrixOnFactoredMatrix() + { + var matrix = _matrices["Tall3x2"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var tau = new double[matrix.ColumnCount]; - var q = new double[matrix.RowCount * matrix.RowCount]; - Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau); + var tau = new double[matrix.ColumnCount]; + var q = new double[matrix.RowCount*matrix.RowCount]; + Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x); - var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var mb = new DenseMatrix(matrix.RowCount, 2, b); + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; - AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); - AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); - AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); - AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); - } + AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); + AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); + AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); + AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); + } - /// - /// Can solve Ax=b using QR factorization with a square A matrix - /// using a factored A matrix with a work array. - /// - [Test] - public void CanSolveUsingQRSquareMatrixOnFactoredMatrixWithWorkArray() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.RowCount]; - Array.Copy(matrix.Values, a, a.Length); - - var tau = new double[matrix.ColumnCount]; - var q = new double[matrix.ColumnCount * matrix.ColumnCount]; - var work = new double[2048]; - Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau, work); - - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work); - - var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; - - AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); - AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); - AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); - AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); - AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); - AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); - } + /// + /// Can solve Ax=b using QR factorization with a square A matrix + /// using a factored A matrix with a work array. + /// + [Test] + public void CanSolveUsingQRSquareMatrixOnFactoredMatrixWithWorkArray() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.RowCount]; + Array.Copy(matrix.Values, a, a.Length); + + var tau = new double[matrix.ColumnCount]; + var q = new double[matrix.ColumnCount*matrix.ColumnCount]; + var work = new double[2048]; + Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau, work); + + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work); + + var mx = new DenseMatrix(matrix.ColumnCount, 2, x); + var mb = matrix*mx; + + AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); + AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); + AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); + AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); + AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); + AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); + } - /// - /// Can solve Ax=b using QR factorization with a tall A matrix - /// using a factored A matrix with a work array. - /// - [Test] - public void CanSolveUsingQRTallMatrixOnFactoredMatrixWithWorkArray() - { - var matrix = _matrices["Tall3x2"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); - - var tau = new double[matrix.ColumnCount]; - var q = new double[matrix.RowCount * matrix.RowCount]; - var work = new double[2048]; - Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau, work); - - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work); - - var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; - - AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); - AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); - AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); - AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); - } + /// + /// Can solve Ax=b using QR factorization with a tall A matrix + /// using a factored A matrix with a work array. + /// + [Test] + public void CanSolveUsingQRTallMatrixOnFactoredMatrixWithWorkArray() + { + var matrix = _matrices["Tall3x2"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); + + var tau = new double[matrix.ColumnCount]; + var q = new double[matrix.RowCount*matrix.RowCount]; + var work = new double[2048]; + Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau, work); + + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work); + + var mb = new DenseMatrix(matrix.RowCount, 2, b); + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; + + AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); + AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); + AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); + AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); + } - /// - /// Can solve Ax=b using thin QR factorization with a square A matrix. - /// - [Test] - public void CanSolveUsingThinQRSquareMatrix() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + /// + /// Can solve Ax=b using thin QR factorization with a square A matrix. + /// + [Test] + public void CanSolveUsingThinQRSquareMatrix() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, QRMethod.Thin); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, QRMethod.Thin); - NotModified(3, 3, a, matrix); + NotModified(3, 3, a, matrix); - var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mx = new DenseMatrix(matrix.ColumnCount, 2, x); + var mb = matrix*mx; - AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); - AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); - AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); - AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); - AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); - AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); - } + AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); + AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); + AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); + AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); + AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); + AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); + } - /// - /// Can solve Ax=b using thin QR factorization with a tall A matrix. - /// - [Test] - public void CanSolveUsingThinQRTallMatrix() - { - var matrix = _matrices["Tall3x2"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + /// + /// Can solve Ax=b using thin QR factorization with a tall A matrix. + /// + [Test] + public void CanSolveUsingThinQRTallMatrix() + { + var matrix = _matrices["Tall3x2"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, QRMethod.Thin); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, QRMethod.Thin); - NotModified(3, 2, a, matrix); + NotModified(3, 2, a, matrix); - var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var mb = new DenseMatrix(matrix.RowCount, 2, b); + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; - AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); - AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); - AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); - AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); - } + AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); + AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); + AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); + AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); + } - /// - /// Can solve Ax=b using thin QR factorization with a square A matrix - /// using a work array. - /// - [Test] - public void CanSolveUsingThinQRSquareMatrixUsingWorkArray() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); - - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - var work = new double[matrix.RowCount * matrix.ColumnCount]; - Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work, QRMethod.Thin); - - NotModified(3, 3, a, matrix); - - var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; - - AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); - AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); - AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); - AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); - AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); - AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); - } + /// + /// Can solve Ax=b using thin QR factorization with a square A matrix + /// using a work array. + /// + [Test] + public void CanSolveUsingThinQRSquareMatrixUsingWorkArray() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); + + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + var work = new double[matrix.RowCount*matrix.ColumnCount]; + Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work, QRMethod.Thin); + + NotModified(3, 3, a, matrix); + + var mx = new DenseMatrix(matrix.ColumnCount, 2, x); + var mb = matrix*mx; + + AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); + AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); + AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); + AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); + AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); + AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); + } - /// - /// Can solve Ax=b using thin QR factorization with a tall A matrix - /// using a work array. - /// - [Test] - public void CanSolveUsingThinQRTallMatrixUsingWorkArray() - { - var matrix = _matrices["Tall3x2"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + /// + /// Can solve Ax=b using thin QR factorization with a tall A matrix + /// using a work array. + /// + [Test] + public void CanSolveUsingThinQRTallMatrixUsingWorkArray() + { + var matrix = _matrices["Tall3x2"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - var work = new double[matrix.RowCount * matrix.ColumnCount]; - Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work, QRMethod.Thin); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + var work = new double[matrix.RowCount*matrix.ColumnCount]; + Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work, QRMethod.Thin); - NotModified(3, 2, a, matrix); + NotModified(3, 2, a, matrix); - var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var mb = new DenseMatrix(matrix.RowCount, 2, b); + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; - AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); - AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); - AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); - AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); - } + AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); + AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); + AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); + AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); + } - /// - /// Can solve Ax=b using thin QR factorization with a square A matrix - /// using a factored A matrix. - /// - [Test] - public void CanSolveUsingThinQRSquareMatrixOnFactoredMatrix() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); - - var tau = new double[matrix.ColumnCount]; - var r = new double[matrix.ColumnCount * matrix.ColumnCount]; - Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau); - - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, QRMethod.Thin); - - var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; - - AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); - AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); - AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); - AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); - AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); - AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); - } + /// + /// Can solve Ax=b using thin QR factorization with a square A matrix + /// using a factored A matrix. + /// + [Test] + public void CanSolveUsingThinQRSquareMatrixOnFactoredMatrix() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); + + var tau = new double[matrix.ColumnCount]; + var r = new double[matrix.ColumnCount*matrix.ColumnCount]; + Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau); + + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, QRMethod.Thin); + + var mx = new DenseMatrix(matrix.ColumnCount, 2, x); + var mb = matrix*mx; + + AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); + AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); + AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); + AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); + AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); + AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); + } - /// - /// Can solve Ax=b using thin QR factorization with a tall A matrix - /// using a factored A matrix. - /// - [Test] - public void CanSolveUsingThinQRTallMatrixOnFactoredMatrix() - { - var matrix = _matrices["Tall3x2"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + /// + /// Can solve Ax=b using thin QR factorization with a tall A matrix + /// using a factored A matrix. + /// + [Test] + public void CanSolveUsingThinQRTallMatrixOnFactoredMatrix() + { + var matrix = _matrices["Tall3x2"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var tau = new double[matrix.ColumnCount]; - var r = new double[matrix.ColumnCount * matrix.ColumnCount]; - Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau); + var tau = new double[matrix.ColumnCount]; + var r = new double[matrix.ColumnCount*matrix.ColumnCount]; + Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, QRMethod.Thin); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, QRMethod.Thin); - var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var mb = new DenseMatrix(matrix.RowCount, 2, b); + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; - AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); - AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); - AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); - AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); - } + AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); + AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); + AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); + AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); + } - /// - /// Can solve Ax=b using thin QR factorization with a square A matrix - /// using a factored A matrix with a work array. - /// - [Test] - public void CanSolveUsingThinQRSquareMatrixOnFactoredMatrixWithWorkArray() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); - - var tau = new double[matrix.ColumnCount]; - var r = new double[matrix.ColumnCount * matrix.ColumnCount]; - var work = new double[2048]; - Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau, work); - - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work, QRMethod.Thin); - - var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; - - AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); - AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); - AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); - AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); - AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); - AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); - } + /// + /// Can solve Ax=b using thin QR factorization with a square A matrix + /// using a factored A matrix with a work array. + /// + [Test] + public void CanSolveUsingThinQRSquareMatrixOnFactoredMatrixWithWorkArray() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); + + var tau = new double[matrix.ColumnCount]; + var r = new double[matrix.ColumnCount*matrix.ColumnCount]; + var work = new double[2048]; + Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau, work); + + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work, QRMethod.Thin); + + var mx = new DenseMatrix(matrix.ColumnCount, 2, x); + var mb = matrix*mx; + + AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); + AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); + AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); + AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); + AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); + AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); + } - /// - /// Can solve Ax=b using thin QR factorization with a tall A matrix - /// using a factored A matrix with a work array. - /// - [Test] - public void CanSolveUsingThinQRTallMatrixOnFactoredMatrixWithWorkArray() - { - var matrix = _matrices["Tall3x2"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); - - var tau = new double[matrix.ColumnCount]; - var r = new double[matrix.ColumnCount * matrix.ColumnCount]; - var work = new double[2048]; - Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau, work); - - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work, QRMethod.Thin ); - - var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; - - AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); - AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); - AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); - AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); - } - - /// - /// Can compute the SVD factorization of a square matrix. - /// - [Test] - public void CanComputeSVDFactorizationOfSquareMatrix() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + /// + /// Can solve Ax=b using thin QR factorization with a tall A matrix + /// using a factored A matrix with a work array. + /// + [Test] + public void CanSolveUsingThinQRTallMatrixOnFactoredMatrixWithWorkArray() + { + var matrix = _matrices["Tall3x2"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); + + var tau = new double[matrix.ColumnCount]; + var r = new double[matrix.ColumnCount*matrix.ColumnCount]; + var work = new double[2048]; + Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau, work); + + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work, QRMethod.Thin); + + var mb = new DenseMatrix(matrix.RowCount, 2, b); + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; + + AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); + AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); + AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); + AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); + } - var s = new double[matrix.RowCount]; - var u = new double[matrix.RowCount * matrix.RowCount]; - var vt = new double[matrix.ColumnCount * matrix.ColumnCount]; + /// + /// Can compute the SVD factorization of a square matrix. + /// + [Test] + public void CanComputeSVDFactorizationOfSquareMatrix() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); + var s = new double[matrix.RowCount]; + var u = new double[matrix.RowCount*matrix.RowCount]; + var vt = new double[matrix.ColumnCount*matrix.ColumnCount]; - var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); - for (var index = 0; index < s.Length; index++) - { - w[index, index] = s[index]; - } + Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); - var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); - var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; - - AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); - AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); - AssertHelpers.AlmostEqual(matrix[2, 0], result[2, 0], 14); - AssertHelpers.AlmostEqual(matrix[0, 1], result[0, 1], 14); - AssertHelpers.AlmostEqual(matrix[1, 1], result[1, 1], 14); - AssertHelpers.AlmostEqual(matrix[2, 1], result[2, 1], 14); - AssertHelpers.AlmostEqual(matrix[0, 2], result[0, 2], 14); - AssertHelpers.AlmostEqual(matrix[1, 2], result[1, 2], 14); - AssertHelpers.AlmostEqual(matrix[2, 2], result[2, 2], 14); + var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); + for (var index = 0; index < s.Length; index++) + { + w[index, index] = s[index]; } - /// - /// Can compute the SVD factorization of a tall matrix. - /// - [Test] - public void CanComputeSVDFactorizationOfTallMatrix() - { - var matrix = _matrices["Tall3x2"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); + var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); + var result = mU*w*mV; - var s = new double[matrix.ColumnCount]; - var u = new double[matrix.RowCount * matrix.RowCount]; - var vt = new double[matrix.ColumnCount * matrix.ColumnCount]; + AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); + AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); + AssertHelpers.AlmostEqual(matrix[2, 0], result[2, 0], 14); + AssertHelpers.AlmostEqual(matrix[0, 1], result[0, 1], 14); + AssertHelpers.AlmostEqual(matrix[1, 1], result[1, 1], 14); + AssertHelpers.AlmostEqual(matrix[2, 1], result[2, 1], 14); + AssertHelpers.AlmostEqual(matrix[0, 2], result[0, 2], 14); + AssertHelpers.AlmostEqual(matrix[1, 2], result[1, 2], 14); + AssertHelpers.AlmostEqual(matrix[2, 2], result[2, 2], 14); + } - Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); + /// + /// Can compute the SVD factorization of a tall matrix. + /// + [Test] + public void CanComputeSVDFactorizationOfTallMatrix() + { + var matrix = _matrices["Tall3x2"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); - for (var index = 0; index < s.Length; index++) - { - w[index, index] = s[index]; - } + var s = new double[matrix.ColumnCount]; + var u = new double[matrix.RowCount*matrix.RowCount]; + var vt = new double[matrix.ColumnCount*matrix.ColumnCount]; - var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); - var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); - AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); - AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); - AssertHelpers.AlmostEqual(matrix[2, 0], result[2, 0], 14); - AssertHelpers.AlmostEqual(matrix[0, 1], result[0, 1], 14); - AssertHelpers.AlmostEqual(matrix[1, 1], result[1, 1], 14); - AssertHelpers.AlmostEqual(matrix[2, 1], result[2, 1], 14); + var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); + for (var index = 0; index < s.Length; index++) + { + w[index, index] = s[index]; } - /// - /// Can compute the SVD factorization of a wide matrix. - /// - [Test] - public void CanComputeSVDFactorizationOfWideMatrix() - { - var matrix = _matrices["Wide2x3"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); + var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); + var result = mU*w*mV; - var s = new double[matrix.RowCount]; - var u = new double[matrix.RowCount * matrix.RowCount]; - var vt = new double[matrix.ColumnCount * matrix.ColumnCount]; + AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); + AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); + AssertHelpers.AlmostEqual(matrix[2, 0], result[2, 0], 14); + AssertHelpers.AlmostEqual(matrix[0, 1], result[0, 1], 14); + AssertHelpers.AlmostEqual(matrix[1, 1], result[1, 1], 14); + AssertHelpers.AlmostEqual(matrix[2, 1], result[2, 1], 14); + } - Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); + /// + /// Can compute the SVD factorization of a wide matrix. + /// + [Test] + public void CanComputeSVDFactorizationOfWideMatrix() + { + var matrix = _matrices["Wide2x3"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); - for (var index = 0; index < s.Length; index++) - { - w[index, index] = s[index]; - } + var s = new double[matrix.RowCount]; + var u = new double[matrix.RowCount*matrix.RowCount]; + var vt = new double[matrix.ColumnCount*matrix.ColumnCount]; - var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); - var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); - AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); - AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); - AssertHelpers.AlmostEqual(matrix[0, 1], result[0, 1], 14); - AssertHelpers.AlmostEqual(matrix[1, 1], result[1, 1], 14); - AssertHelpers.AlmostEqual(matrix[0, 2], result[0, 2], 14); - AssertHelpers.AlmostEqual(matrix[1, 2], result[1, 2], 14); + var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); + for (var index = 0; index < s.Length; index++) + { + w[index, index] = s[index]; } - /// - /// Can compute the SVD factorization of a square matrix using - /// a work array. - /// - [Test] - public void CanComputeSVDFactorizationOfSquareMatrixWithWorkArray() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); + var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); + var result = mU*w*mV; - var s = new double[matrix.RowCount]; - var u = new double[matrix.RowCount * matrix.RowCount]; - var vt = new double[matrix.ColumnCount * matrix.ColumnCount]; - var work = new double[100]; + AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); + AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); + AssertHelpers.AlmostEqual(matrix[0, 1], result[0, 1], 14); + AssertHelpers.AlmostEqual(matrix[1, 1], result[1, 1], 14); + AssertHelpers.AlmostEqual(matrix[0, 2], result[0, 2], 14); + AssertHelpers.AlmostEqual(matrix[1, 2], result[1, 2], 14); + } + + /// + /// Can compute the SVD factorization of a square matrix using + /// a work array. + /// + [Test] + public void CanComputeSVDFactorizationOfSquareMatrixWithWorkArray() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); + var s = new double[matrix.RowCount]; + var u = new double[matrix.RowCount*matrix.RowCount]; + var vt = new double[matrix.ColumnCount*matrix.ColumnCount]; + var work = new double[100]; - var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); - for (var index = 0; index < s.Length; index++) - { - w[index, index] = s[index]; - } + Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); - var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); - var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; - - AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); - AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); - AssertHelpers.AlmostEqual(matrix[2, 0], result[2, 0], 14); - AssertHelpers.AlmostEqual(matrix[0, 1], result[0, 1], 14); - AssertHelpers.AlmostEqual(matrix[1, 1], result[1, 1], 14); - AssertHelpers.AlmostEqual(matrix[2, 1], result[2, 1], 14); - AssertHelpers.AlmostEqual(matrix[0, 2], result[0, 2], 14); - AssertHelpers.AlmostEqual(matrix[1, 2], result[1, 2], 14); - AssertHelpers.AlmostEqual(matrix[2, 2], result[2, 2], 14); + var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); + for (var index = 0; index < s.Length; index++) + { + w[index, index] = s[index]; } - /// - /// Can compute the SVD factorization of a tall matrix using - /// a work array. - /// - [Test] - public void CanComputeSVDFactorizationOfTallMatrixWithWorkArray() - { - var matrix = _matrices["Tall3x2"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); + var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); + var result = mU*w*mV; - var s = new double[matrix.ColumnCount]; - var u = new double[matrix.RowCount * matrix.RowCount]; - var vt = new double[matrix.ColumnCount * matrix.ColumnCount]; - var work = new double[100]; + AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); + AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); + AssertHelpers.AlmostEqual(matrix[2, 0], result[2, 0], 14); + AssertHelpers.AlmostEqual(matrix[0, 1], result[0, 1], 14); + AssertHelpers.AlmostEqual(matrix[1, 1], result[1, 1], 14); + AssertHelpers.AlmostEqual(matrix[2, 1], result[2, 1], 14); + AssertHelpers.AlmostEqual(matrix[0, 2], result[0, 2], 14); + AssertHelpers.AlmostEqual(matrix[1, 2], result[1, 2], 14); + AssertHelpers.AlmostEqual(matrix[2, 2], result[2, 2], 14); + } - Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); + /// + /// Can compute the SVD factorization of a tall matrix using + /// a work array. + /// + [Test] + public void CanComputeSVDFactorizationOfTallMatrixWithWorkArray() + { + var matrix = _matrices["Tall3x2"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); - for (var index = 0; index < s.Length; index++) - { - w[index, index] = s[index]; - } + var s = new double[matrix.ColumnCount]; + var u = new double[matrix.RowCount*matrix.RowCount]; + var vt = new double[matrix.ColumnCount*matrix.ColumnCount]; + var work = new double[100]; - var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); - var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); - AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); - AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); - AssertHelpers.AlmostEqual(matrix[2, 0], result[2, 0], 14); - AssertHelpers.AlmostEqual(matrix[0, 1], result[0, 1], 14); - AssertHelpers.AlmostEqual(matrix[1, 1], result[1, 1], 14); - AssertHelpers.AlmostEqual(matrix[2, 1], result[2, 1], 14); + var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); + for (var index = 0; index < s.Length; index++) + { + w[index, index] = s[index]; } - /// - /// Can compute the SVD factorization of a wide matrix using - /// a work array. - /// - [Test] - public void CanComputeSVDFactorizationOfWideMatrixWithWorkArray() - { - var matrix = _matrices["Wide2x3"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); + var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); + var result = mU*w*mV; - var s = new double[matrix.RowCount]; - var u = new double[matrix.RowCount * matrix.RowCount]; - var vt = new double[matrix.ColumnCount * matrix.ColumnCount]; - var work = new double[100]; + AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); + AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); + AssertHelpers.AlmostEqual(matrix[2, 0], result[2, 0], 14); + AssertHelpers.AlmostEqual(matrix[0, 1], result[0, 1], 14); + AssertHelpers.AlmostEqual(matrix[1, 1], result[1, 1], 14); + AssertHelpers.AlmostEqual(matrix[2, 1], result[2, 1], 14); + } - Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); + /// + /// Can compute the SVD factorization of a wide matrix using + /// a work array. + /// + [Test] + public void CanComputeSVDFactorizationOfWideMatrixWithWorkArray() + { + var matrix = _matrices["Wide2x3"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); - for (var index = 0; index < s.Length; index++) - { - w[index, index] = s[index]; - } + var s = new double[matrix.RowCount]; + var u = new double[matrix.RowCount*matrix.RowCount]; + var vt = new double[matrix.ColumnCount*matrix.ColumnCount]; + var work = new double[100]; - var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); - var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); - AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); - AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); - AssertHelpers.AlmostEqual(matrix[0, 1], result[0, 1], 14); - AssertHelpers.AlmostEqual(matrix[1, 1], result[1, 1], 14); - AssertHelpers.AlmostEqual(matrix[0, 2], result[0, 2], 14); - AssertHelpers.AlmostEqual(matrix[1, 2], result[1, 2], 14); + var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); + for (var index = 0; index < s.Length; index++) + { + w[index, index] = s[index]; } - /// - /// Can solve Ax=b using SVD factorization with a square A matrix. - /// - [Test] - public void CanSolveUsingSVDSquareMatrix() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); + var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); + var result = mU*w*mV; + + AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 14); + AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 14); + AssertHelpers.AlmostEqual(matrix[0, 1], result[0, 1], 14); + AssertHelpers.AlmostEqual(matrix[1, 1], result[1, 1], 14); + AssertHelpers.AlmostEqual(matrix[0, 2], result[0, 2], 14); + AssertHelpers.AlmostEqual(matrix[1, 2], result[1, 2], 14); + } + + /// + /// Can solve Ax=b using SVD factorization with a square A matrix. + /// + [Test] + public void CanSolveUsingSVDSquareMatrix() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.SvdSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.SvdSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); - NotModified(3, 3, a, matrix); + NotModified(3, 3, a, matrix); - var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mx = new DenseMatrix(matrix.ColumnCount, 2, x); + var mb = matrix*mx; - AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); - AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); - AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); - AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); - AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); - AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); - } + AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); + AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); + AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); + AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); + AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); + AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); + } - /// - /// Can solve Ax=b using SVD factorization with a tall A matrix. - /// - [Test] - public void CanSolveUsingSVDTallMatrix() - { - var matrix = _matrices["Tall3x2"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + /// + /// Can solve Ax=b using SVD factorization with a tall A matrix. + /// + [Test] + public void CanSolveUsingSVDTallMatrix() + { + var matrix = _matrices["Tall3x2"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.SvdSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.SvdSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); - NotModified(3, 2, a, matrix); + NotModified(3, 2, a, matrix); - var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var mb = new DenseMatrix(matrix.RowCount, 2, b); + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; - AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); - AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); - AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); - AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); - } + AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); + AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); + AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); + AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); + } - /// - /// Can solve Ax=b using SVD factorization with a square A matrix - /// using a factored matrix. - /// - [Test] - public void CanSolveUsingSVDSquareMatrixOnFactoredMatrix() - { - var matrix = _matrices["Square3x3"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + /// + /// Can solve Ax=b using SVD factorization with a square A matrix + /// using a factored matrix. + /// + [Test] + public void CanSolveUsingSVDSquareMatrixOnFactoredMatrix() + { + var matrix = _matrices["Square3x3"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var s = new double[matrix.RowCount]; - var u = new double[matrix.RowCount * matrix.RowCount]; - var vt = new double[matrix.ColumnCount * matrix.ColumnCount]; + var s = new double[matrix.RowCount]; + var u = new double[matrix.RowCount*matrix.RowCount]; + var vt = new double[matrix.ColumnCount*matrix.ColumnCount]; - Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); + Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.SvdSolveFactored(matrix.RowCount, matrix.ColumnCount, s, u, vt, b, 2, x); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.SvdSolveFactored(matrix.RowCount, matrix.ColumnCount, s, u, vt, b, 2, x); - var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mx = new DenseMatrix(matrix.ColumnCount, 2, x); + var mb = matrix*mx; - AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); - AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); - AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); - AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); - AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); - AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); - } + AssertHelpers.AlmostEqual(mb[0, 0], b[0], 14); + AssertHelpers.AlmostEqual(mb[1, 0], b[1], 14); + AssertHelpers.AlmostEqual(mb[2, 0], b[2], 14); + AssertHelpers.AlmostEqual(mb[0, 1], b[3], 14); + AssertHelpers.AlmostEqual(mb[1, 1], b[4], 14); + AssertHelpers.AlmostEqual(mb[2, 1], b[5], 14); + } - /// - /// Can solve Ax=b using SVD factorization with a tall A matrix - /// using a factored matrix. - /// - [Test] - public void CanSolveUsingSVDTallMatrixOnFactoredMatrix() - { - var matrix = _matrices["Tall3x2"]; - var a = new double[matrix.RowCount * matrix.ColumnCount]; - Array.Copy(matrix.Values, a, a.Length); + /// + /// Can solve Ax=b using SVD factorization with a tall A matrix + /// using a factored matrix. + /// + [Test] + public void CanSolveUsingSVDTallMatrixOnFactoredMatrix() + { + var matrix = _matrices["Tall3x2"]; + var a = new double[matrix.RowCount*matrix.ColumnCount]; + Array.Copy(matrix.Values, a, a.Length); - var s = new double[matrix.ColumnCount]; - var u = new double[matrix.RowCount * matrix.RowCount]; - var vt = new double[matrix.ColumnCount * matrix.ColumnCount]; + var s = new double[matrix.ColumnCount]; + var u = new double[matrix.RowCount*matrix.RowCount]; + var vt = new double[matrix.ColumnCount*matrix.ColumnCount]; - Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); + Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); - var b = new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }; - var x = new double[matrix.ColumnCount * 2]; - Control.LinearAlgebraProvider.SvdSolveFactored(matrix.RowCount, matrix.ColumnCount, s, u, vt, b, 2, x); + var b = new[] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}; + var x = new double[matrix.ColumnCount*2]; + Control.LinearAlgebraProvider.SvdSolveFactored(matrix.RowCount, matrix.ColumnCount, s, u, vt, b, 2, x); - var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var mb = new DenseMatrix(matrix.RowCount, 2, b); + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; - AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); - AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); - AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); - AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); - } + AssertHelpers.AlmostEqual(test[0, 0], x[0], 14); + AssertHelpers.AlmostEqual(test[1, 0], x[1], 14); + AssertHelpers.AlmostEqual(test[0, 1], x[2], 14); + AssertHelpers.AlmostEqual(test[1, 1], x[3], 14); + } - [TestCase("Wide10x50000", "Tall50000x10")] - [TestCase("Square1000x1000", "Square1000x1000")] - [Timeout(1000 * 10)] - public void IsMatrixMultiplicationPerformant(string leftMatrixKey, string rightMatrixKey) - { - var leftMatrix = _matrices[leftMatrixKey]; - var rightMatrix = _matrices[rightMatrixKey]; - var result = leftMatrix*rightMatrix; - Assert.That(result, Is.Not.Null); - } + [TestCase("Wide10x50000", "Tall50000x10")] + [TestCase("Square1000x1000", "Square1000x1000")] + [Timeout(1000*10)] + public void IsMatrixMultiplicationPerformant(string leftMatrixKey, string rightMatrixKey) + { + var leftMatrix = _matrices[leftMatrixKey]; + var rightMatrix = _matrices[rightMatrixKey]; + var result = leftMatrix*rightMatrix; + Assert.That(result, Is.Not.Null); + } /// /// Checks to see if a matrix and array contain the same values. @@ -1707,7 +1711,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Double /// number of columns. /// array to check. /// matrix to check against. - private static void NotModified(int rows, int columns, IList array, Matrix matrix) + static void NotModified(int rows, int columns, IList array, Matrix matrix) { var index = 0; for (var col = 0; col < columns; col++) diff --git a/src/UnitTests/LinearAlgebraProviderTests/Single/LinearAlgebraProviderTests.cs b/src/UnitTests/LinearAlgebraProviderTests/Single/LinearAlgebraProviderTests.cs index c7ebac4d..f36d64b5 100644 --- a/src/UnitTests/LinearAlgebraProviderTests/Single/LinearAlgebraProviderTests.cs +++ b/src/UnitTests/LinearAlgebraProviderTests/Single/LinearAlgebraProviderTests.cs @@ -3,7 +3,9 @@ // http://numerics.mathdotnet.com // http://github.com/mathnet/mathnet-numerics // http://mathnetnumerics.codeplex.com -// Copyright (c) 2009-2010 Math.NET +// +// Copyright (c) 2009-2013 Math.NET +// // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without @@ -12,8 +14,10 @@ // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: +// // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND @@ -44,30 +48,30 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single /// /// The Y float test vector. /// - private readonly float[] _y = new[] { 1.1f, 2.2f, 3.3f, 4.4f, 5.5f }; + readonly float[] _y = new[] {1.1f, 2.2f, 3.3f, 4.4f, 5.5f}; /// /// The X float test vector. /// - private readonly float[] _x = new[] { 6.6f, 7.7f, 8.8f, 9.9f, 10.1f }; + readonly float[] _x = new[] {6.6f, 7.7f, 8.8f, 9.9f, 10.1f}; - private static readonly IContinuousDistribution Dist = new Normal(); + static readonly IContinuousDistribution Dist = new Normal(); /// /// Test matrix to use. /// readonly IDictionary _matrices = new Dictionary - { - { "Singular3x3", new DenseMatrix(new[,] { { 1.0f, 1.0f, 2.0f }, { 1.0f, 1.0f, 2.0f }, { 1.0f, 1.0f, 2.0f } }) }, - { "Square3x3", new DenseMatrix(new[,] { { -1.1f, -2.2f, -3.3f }, { 0.0f, 1.1f, 2.2f }, { -4.4f, 5.5f, 6.6f } }) }, - { "Square4x4", new DenseMatrix(new[,] { { -1.1f, -2.2f, -3.3f, -4.4f }, { 0.0f, 1.1f, 2.2f, 3.3f }, { 1.0f, 2.1f, 6.2f, 4.3f }, { -4.4f, 5.5f, 6.6f, -7.7f } }) }, - { "Singular4x4", new DenseMatrix(new[,] { { -1.1f, -2.2f, -3.3f, -4.4f }, { -1.1f, -2.2f, -3.3f, -4.4f }, { -1.1f, -2.2f, -3.3f, -4.4f }, { -1.1f, -2.2f, -3.3f, -4.4f } }) }, - { "Tall3x2", new DenseMatrix(new[,] { { -1.1f, -2.2f }, { 0.0f, 1.1f }, { -4.4f, 5.5f } }) }, - { "Wide2x3", new DenseMatrix(new[,] { { -1.1f, -2.2f, -3.3f }, { 0.0f, 1.1f, 2.2f } }) }, - { "Tall50000x10", DenseMatrix.CreateRandom(50000, 10, Dist) }, - { "Wide10x50000", DenseMatrix.CreateRandom(10, 50000, Dist) }, - { "Square1000x1000", DenseMatrix.CreateRandom(1000, 1000, Dist) } - }; + { + {"Singular3x3", new DenseMatrix(new[,] {{1.0f, 1.0f, 2.0f}, {1.0f, 1.0f, 2.0f}, {1.0f, 1.0f, 2.0f}})}, + {"Square3x3", new DenseMatrix(new[,] {{-1.1f, -2.2f, -3.3f}, {0.0f, 1.1f, 2.2f}, {-4.4f, 5.5f, 6.6f}})}, + {"Square4x4", new DenseMatrix(new[,] {{-1.1f, -2.2f, -3.3f, -4.4f}, {0.0f, 1.1f, 2.2f, 3.3f}, {1.0f, 2.1f, 6.2f, 4.3f}, {-4.4f, 5.5f, 6.6f, -7.7f}})}, + {"Singular4x4", new DenseMatrix(new[,] {{-1.1f, -2.2f, -3.3f, -4.4f}, {-1.1f, -2.2f, -3.3f, -4.4f}, {-1.1f, -2.2f, -3.3f, -4.4f}, {-1.1f, -2.2f, -3.3f, -4.4f}})}, + {"Tall3x2", new DenseMatrix(new[,] {{-1.1f, -2.2f}, {0.0f, 1.1f}, {-4.4f, 5.5f}})}, + {"Wide2x3", new DenseMatrix(new[,] {{-1.1f, -2.2f, -3.3f}, {0.0f, 1.1f, 2.2f}})}, + {"Tall50000x10", DenseMatrix.CreateRandom(50000, 10, Dist)}, + {"Wide10x50000", DenseMatrix.CreateRandom(10, 50000, Dist)}, + {"Square1000x1000", DenseMatrix.CreateRandom(1000, 1000, Dist)} + }; /// /// Can add a vector to scaled vector @@ -91,10 +95,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single } Array.Copy(_y, result, _y.Length); - Control.LinearAlgebraProvider.AddVectorToScaledVector(result, (float)Math.PI, _x, result); + Control.LinearAlgebraProvider.AddVectorToScaledVector(result, (float) Math.PI, _x, result); for (var i = 0; i < _y.Length; i++) { - AssertHelpers.AlmostEqual(_y[i] + ((float)Math.PI * _x[i]), result[i], 6); + AssertHelpers.AlmostEqual(_y[i] + ((float) Math.PI*_x[i]), result[i], 6); } } @@ -113,10 +117,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single } Array.Copy(_y, result, _y.Length); - Control.LinearAlgebraProvider.ScaleArray((float)Math.PI, result, result); + Control.LinearAlgebraProvider.ScaleArray((float) Math.PI, result, result); for (var i = 0; i < _y.Length; i++) { - AssertHelpers.AlmostEqual(_y[i] * (float)Math.PI, result[i], 6); + AssertHelpers.AlmostEqual(_y[i]*(float) Math.PI, result[i], 6); } } @@ -168,7 +172,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single Control.LinearAlgebraProvider.PointWiseMultiplyArrays(_x, _y, result); for (var i = 0; i < result.Length; i++) { - Assert.AreEqual(_x[i] * _y[i], result[i]); + Assert.AreEqual(_x[i]*_y[i], result[i]); } } @@ -182,7 +186,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single Control.LinearAlgebraProvider.PointWiseDivideArrays(_x, _y, result); for (var i = 0; i < result.Length; i++) { - Assert.AreEqual(_x[i] / _y[i], result[i]); + Assert.AreEqual(_x[i]/_y[i], result[i]); } } @@ -274,7 +278,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 6); + AssertHelpers.AlmostEqual(x.Row(i)*y.Column(j), c[i, j], 6); } } } @@ -295,7 +299,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 6); + AssertHelpers.AlmostEqual(x.Row(i)*y.Column(j), c[i, j], 6); } } } @@ -316,7 +320,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(x.Row(i) * y.Column(j), c[i, j], 6); + AssertHelpers.AlmostEqual(x.Row(i)*y.Column(j), c[i, j], 6); } } } @@ -337,7 +341,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(2.2f * x.Row(i) * y.Column(j), c[i, j], 6); + AssertHelpers.AlmostEqual(2.2f*x.Row(i)*y.Column(j), c[i, j], 6); } } } @@ -358,7 +362,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single { for (var j = 0; j < c.ColumnCount; j++) { - AssertHelpers.AlmostEqual(2.2f * x.Row(i) * y.Column(j), c[i, j], 6); + AssertHelpers.AlmostEqual(2.2f*x.Row(i)*y.Column(j), c[i, j], 6); } } } @@ -379,7 +383,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single { for (var j = 0; j < c.ColumnCount; j++) { - var test = 2.2f * x.Row(i) * y.Column(j); + var test = 2.2f*x.Row(i)*y.Column(j); // if they are both close to zero, skip if (Math.Abs(test) < 1e-7 && Math.Abs(c[i, j]) < 1e-7) @@ -387,7 +391,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single continue; } - AssertHelpers.AlmostEqual(2.2f * x.Row(i) * y.Column(j), c[i, j], 6); + AssertHelpers.AlmostEqual(2.2f*x.Row(i)*y.Column(j), c[i, j], 6); } } } @@ -399,7 +403,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeLuFactor() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.RowCount]; + var a = new float[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var ipiv = new int[matrix.RowCount]; @@ -427,7 +431,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeLuInverse() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.RowCount]; + var a = new float[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); Control.LinearAlgebraProvider.LUInverse(a, matrix.RowCount); @@ -451,7 +455,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeLuInverseOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.RowCount]; + var a = new float[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var ipiv = new int[matrix.RowCount]; @@ -478,7 +482,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeLuInverseWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.RowCount]; + var a = new float[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var work = new float[matrix.RowCount]; @@ -503,7 +507,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeLuInverseOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.RowCount]; + var a = new float[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var ipiv = new int[matrix.RowCount]; @@ -531,10 +535,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingLU() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.RowCount]; + var a = new float[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; Control.LinearAlgebraProvider.LUSolve(2, a, matrix.RowCount, b); AssertHelpers.AlmostEqual(b[0], -1.477272727272726, 6); @@ -554,13 +558,13 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingLUOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.RowCount]; + var a = new float[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var ipiv = new int[matrix.RowCount]; Control.LinearAlgebraProvider.LUFactor(a, matrix.RowCount, ipiv); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; Control.LinearAlgebraProvider.LUSolveFactored(2, a, matrix.RowCount, ipiv, b); AssertHelpers.AlmostEqual(b[0], -1.477272727272726, 6); @@ -577,7 +581,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single [Test] public void CanComputeCholeskyFactor() { - var matrix = new float[] { 1, 1, 1, 1, 1, 5, 5, 5, 1, 5, 14, 14, 1, 5, 14, 15 }; + var matrix = new float[] {1, 1, 1, 1, 1, 5, 5, 5, 1, 5, 14, 14, 1, 5, 14, 15}; Control.LinearAlgebraProvider.CholeskyFactor(matrix, 4); Assert.AreEqual(matrix[0], 1); Assert.AreEqual(matrix[1], 1); @@ -603,10 +607,10 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single [Test] public void CanSolveUsingCholesky() { - var matrix = new DenseMatrix(3, 3, new float[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 }); - var a = new float[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 }; + var matrix = new DenseMatrix(3, 3, new float[] {1, 1, 1, 1, 2, 3, 1, 3, 6}); + var a = new float[] {1, 1, 1, 1, 2, 3, 1, 3, 6}; - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; Control.LinearAlgebraProvider.CholeskySolve(a, 3, b, 2); AssertHelpers.AlmostEqual(b[0], 0, 6); @@ -625,11 +629,11 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single [Test] public void CanSolveUsingCholeskyOnFactoredMatrix() { - var a = new float[] { 1, 1, 1, 1, 2, 3, 1, 3, 6 }; + var a = new float[] {1, 1, 1, 1, 2, 3, 1, 3, 6}; Control.LinearAlgebraProvider.CholeskyFactor(a, 3); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; Control.LinearAlgebraProvider.CholeskySolveFactored(a, 3, b, 2); AssertHelpers.AlmostEqual(b[0], 0, 6); @@ -647,16 +651,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeQRFactorSquareMatrix() { var matrix = _matrices["Square3x3"]; - var r = new float[matrix.RowCount * matrix.ColumnCount]; + var r = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new float[3]; - var q = new float[matrix.RowCount * matrix.RowCount]; + var q = new float[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -674,16 +678,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeQRFactorTallMatrix() { var matrix = _matrices["Tall3x2"]; - var r = new float[matrix.RowCount * matrix.ColumnCount]; + var r = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new float[3]; - var q = new float[matrix.RowCount * matrix.RowCount]; + var q = new float[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -701,16 +705,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeQRFactorWideMatrix() { var matrix = _matrices["Wide2x3"]; - var r = new float[matrix.RowCount * matrix.ColumnCount]; + var r = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new float[3]; - var q = new float[matrix.RowCount * matrix.RowCount]; + var q = new float[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -728,17 +732,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeQRFactorSquareMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var r = new float[matrix.RowCount * matrix.ColumnCount]; + var r = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new float[3]; - var q = new float[matrix.RowCount * matrix.RowCount]; - var work = new float[matrix.ColumnCount * Control.BlockSize]; + var q = new float[matrix.RowCount*matrix.RowCount]; + var work = new float[matrix.ColumnCount*Control.BlockSize]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -756,17 +760,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeQRFactorTallMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var r = new float[matrix.RowCount * matrix.ColumnCount]; + var r = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new float[3]; - var q = new float[matrix.RowCount * matrix.RowCount]; - var work = new float[matrix.ColumnCount * Control.BlockSize]; + var q = new float[matrix.RowCount*matrix.RowCount]; + var work = new float[matrix.ColumnCount*Control.BlockSize]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -784,17 +788,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeQRFactorWideMatrixWithWorkArray() { var matrix = _matrices["Wide2x3"]; - var r = new float[matrix.RowCount * matrix.ColumnCount]; + var r = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, r, r.Length); var tau = new float[3]; - var q = new float[matrix.RowCount * matrix.RowCount]; - var work = new float[matrix.ColumnCount * Control.BlockSize]; + var q = new float[matrix.RowCount*matrix.RowCount]; + var work = new float[matrix.ColumnCount*Control.BlockSize]; Control.LinearAlgebraProvider.QRFactor(r, matrix.RowCount, matrix.ColumnCount, q, tau, work); var mr = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, r).UpperTriangle(); var mq = new DenseMatrix(matrix.RowCount, matrix.RowCount, q); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -812,16 +816,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeThinQRFactorSquareMatrix() { var matrix = _matrices["Square3x3"]; - var r = new float[matrix.ColumnCount * matrix.ColumnCount]; + var r = new float[matrix.ColumnCount*matrix.ColumnCount]; var tau = new float[3]; - var q = new float[matrix.RowCount * matrix.ColumnCount]; + var q = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, q, q.Length); Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau); var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -839,16 +843,16 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeThinQRFactorTallMatrix() { var matrix = _matrices["Tall3x2"]; - var r = new float[matrix.ColumnCount * matrix.ColumnCount]; + var r = new float[matrix.ColumnCount*matrix.ColumnCount]; var tau = new float[3]; - var q = new float[matrix.RowCount * matrix.ColumnCount]; + var q = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, q, q.Length); Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau); var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -866,17 +870,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeThinQRFactorSquareMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var r = new float[matrix.ColumnCount * matrix.ColumnCount]; + var r = new float[matrix.ColumnCount*matrix.ColumnCount]; var tau = new float[3]; - var q = new float[matrix.RowCount * matrix.ColumnCount]; + var q = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, q, q.Length); - var work = new float[matrix.RowCount * matrix.ColumnCount]; + var work = new float[matrix.RowCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau, work); var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { @@ -894,17 +898,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeThinQRFactorTallMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var r = new float[matrix.ColumnCount * matrix.ColumnCount]; + var r = new float[matrix.ColumnCount*matrix.ColumnCount]; var tau = new float[3]; - var q = new float[matrix.RowCount * matrix.ColumnCount]; + var q = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, q, q.Length); - var work = new float[matrix.RowCount * matrix.ColumnCount]; + var work = new float[matrix.RowCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.ThinQRFactor(q, matrix.RowCount, matrix.ColumnCount, r, tau, work); var mq = new DenseMatrix(matrix.RowCount, matrix.ColumnCount, q); var mr = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, r); - var a = mq * mr; + var a = mq*mr; for (var row = 0; row < matrix.RowCount; row++) { for (var col = 0; col < matrix.ColumnCount; col++) @@ -921,17 +925,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingQRSquareMatrix() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -948,17 +952,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingQRTallMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -974,18 +978,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingQRSquareMatrixUsingWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; - var work = new float[matrix.RowCount * matrix.RowCount]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; + var work = new float[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1003,18 +1007,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingQRTallMatrixUsingWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; - var work = new float[matrix.RowCount * matrix.RowCount]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; + var work = new float[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1030,19 +1034,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingQRSquareMatrixOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.RowCount]; + var a = new float[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new float[matrix.ColumnCount]; - var q = new float[matrix.ColumnCount * matrix.ColumnCount]; + var q = new float[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1060,19 +1064,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingQRTallMatrixOnFactoredMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new float[matrix.ColumnCount]; - var q = new float[matrix.RowCount * matrix.RowCount]; + var q = new float[matrix.RowCount*matrix.RowCount]; Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1088,20 +1092,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingQRSquareMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.RowCount]; + var a = new float[matrix.RowCount*matrix.RowCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new float[matrix.ColumnCount]; - var q = new float[matrix.ColumnCount * matrix.ColumnCount]; + var q = new float[matrix.ColumnCount*matrix.ColumnCount]; var work = new float[2048]; Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau, work); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1119,20 +1123,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingQRTallMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new float[matrix.ColumnCount]; - var q = new float[matrix.RowCount * matrix.RowCount]; + var q = new float[matrix.RowCount*matrix.RowCount]; var work = new float[2048]; Control.LinearAlgebraProvider.QRFactor(a, matrix.RowCount, matrix.ColumnCount, q, tau, work); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(q, a, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1147,17 +1151,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingThinQRSquareMatrix() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, QRMethod.Thin); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1174,17 +1178,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingThinQRTallMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, QRMethod.Thin); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1200,18 +1204,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingThinQRSquareMatrixUsingWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; - var work = new float[matrix.RowCount * matrix.ColumnCount]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; + var work = new float[matrix.RowCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work, QRMethod.Thin); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1229,18 +1233,18 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingThinQRTallMatrixUsingWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; - var work = new float[matrix.RowCount * matrix.ColumnCount]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; + var work = new float[matrix.RowCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.QRSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x, work, QRMethod.Thin); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1256,19 +1260,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingThinQRSquareMatrixOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new float[matrix.ColumnCount]; - var r = new float[matrix.ColumnCount * matrix.ColumnCount]; + var r = new float[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, QRMethod.Thin); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1286,19 +1290,19 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingThinQRTallMatrixOnFactoredMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new float[matrix.ColumnCount]; - var r = new float[matrix.ColumnCount * matrix.ColumnCount]; + var r = new float[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, QRMethod.Thin); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1314,20 +1318,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingThinQRSquareMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new float[matrix.ColumnCount]; - var r = new float[matrix.ColumnCount * matrix.ColumnCount]; + var r = new float[matrix.ColumnCount*matrix.ColumnCount]; var work = new float[2048]; Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau, work); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work, QRMethod.Thin); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); @@ -1345,20 +1349,20 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingThinQRTallMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var tau = new float[matrix.ColumnCount]; - var r = new float[matrix.ColumnCount * matrix.ColumnCount]; + var r = new float[matrix.ColumnCount*matrix.ColumnCount]; var work = new float[2048]; Control.LinearAlgebraProvider.ThinQRFactor(a, matrix.RowCount, matrix.ColumnCount, r, tau, work); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.QRSolveFactored(a, r, matrix.RowCount, matrix.ColumnCount, tau, b, 2, x, work, QRMethod.Thin); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1373,12 +1377,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeSVDFactorizationOfSquareMatrix() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new float[matrix.RowCount]; - var u = new float[matrix.RowCount * matrix.RowCount]; - var vt = new float[matrix.ColumnCount * matrix.ColumnCount]; + var u = new float[matrix.RowCount*matrix.RowCount]; + var vt = new float[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); @@ -1390,7 +1394,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 6); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 6); @@ -1410,12 +1414,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeSVDFactorizationOfTallMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new float[matrix.ColumnCount]; - var u = new float[matrix.RowCount * matrix.RowCount]; - var vt = new float[matrix.ColumnCount * matrix.ColumnCount]; + var u = new float[matrix.RowCount*matrix.RowCount]; + var vt = new float[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); @@ -1427,7 +1431,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 6); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 6); @@ -1444,12 +1448,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeSVDFactorizationOfWideMatrix() { var matrix = _matrices["Wide2x3"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new float[matrix.RowCount]; - var u = new float[matrix.RowCount * matrix.RowCount]; - var vt = new float[matrix.ColumnCount * matrix.ColumnCount]; + var u = new float[matrix.RowCount*matrix.RowCount]; + var vt = new float[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); @@ -1461,7 +1465,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 6); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 6); @@ -1479,12 +1483,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeSVDFactorizationOfSquareMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new float[matrix.RowCount]; - var u = new float[matrix.RowCount * matrix.RowCount]; - var vt = new float[matrix.ColumnCount * matrix.ColumnCount]; + var u = new float[matrix.RowCount*matrix.RowCount]; + var vt = new float[matrix.ColumnCount*matrix.ColumnCount]; var work = new float[100]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); @@ -1497,7 +1501,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 6); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 6); @@ -1518,12 +1522,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeSVDFactorizationOfTallMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new float[matrix.ColumnCount]; - var u = new float[matrix.RowCount * matrix.RowCount]; - var vt = new float[matrix.ColumnCount * matrix.ColumnCount]; + var u = new float[matrix.RowCount*matrix.RowCount]; + var vt = new float[matrix.ColumnCount*matrix.ColumnCount]; var work = new float[100]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); @@ -1536,7 +1540,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 6); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 6); @@ -1554,12 +1558,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanComputeSVDFactorizationOfWideMatrixWithWorkArray() { var matrix = _matrices["Wide2x3"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new float[matrix.RowCount]; - var u = new float[matrix.RowCount * matrix.RowCount]; - var vt = new float[matrix.ColumnCount * matrix.ColumnCount]; + var u = new float[matrix.RowCount*matrix.RowCount]; + var vt = new float[matrix.ColumnCount*matrix.ColumnCount]; var work = new float[100]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); @@ -1572,7 +1576,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); - var result = mU * w * mV; + var result = mU*w*mV; AssertHelpers.AlmostEqual(matrix[0, 0], result[0, 0], 6); AssertHelpers.AlmostEqual(matrix[1, 0], result[1, 0], 6); @@ -1589,17 +1593,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingSVDSquareMatrix() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.SvdSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); NotModified(3, 3, a, matrix); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 6); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 6); @@ -1616,17 +1620,17 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingSVDTallMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.SvdSolve(a, matrix.RowCount, matrix.ColumnCount, b, 2, x); NotModified(3, 2, a, matrix); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1642,21 +1646,21 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingSVDSquareMatrixOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new float[matrix.RowCount]; - var u = new float[matrix.RowCount * matrix.RowCount]; - var vt = new float[matrix.ColumnCount * matrix.ColumnCount]; + var u = new float[matrix.RowCount*matrix.RowCount]; + var vt = new float[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.SvdSolveFactored(matrix.RowCount, matrix.ColumnCount, s, u, vt, b, 2, x); var mx = new DenseMatrix(matrix.ColumnCount, 2, x); - var mb = matrix * mx; + var mb = matrix*mx; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 6); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 6); @@ -1674,21 +1678,21 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single public void CanSolveUsingSVDTallMatrixOnFactoredMatrix() { var matrix = _matrices["Tall3x2"]; - var a = new float[matrix.RowCount * matrix.ColumnCount]; + var a = new float[matrix.RowCount*matrix.ColumnCount]; Array.Copy(matrix.Values, a, a.Length); var s = new float[matrix.ColumnCount]; - var u = new float[matrix.RowCount * matrix.RowCount]; - var vt = new float[matrix.ColumnCount * matrix.ColumnCount]; + var u = new float[matrix.RowCount*matrix.RowCount]; + var vt = new float[matrix.ColumnCount*matrix.ColumnCount]; Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt); - var b = new[] { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; - var x = new float[matrix.ColumnCount * 2]; + var b = new[] {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f}; + var x = new float[matrix.ColumnCount*2]; Control.LinearAlgebraProvider.SvdSolveFactored(matrix.RowCount, matrix.ColumnCount, s, u, vt, b, 2, x); var mb = new DenseMatrix(matrix.RowCount, 2, b); - var test = (matrix.Transpose() * matrix).Inverse() * matrix.Transpose() * mb; + var test = (matrix.Transpose()*matrix).Inverse()*matrix.Transpose()*mb; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); @@ -1698,12 +1702,12 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single [TestCase("Wide10x50000", "Tall50000x10")] [TestCase("Square1000x1000", "Square1000x1000")] - [Timeout(1000 * 10)] + [Timeout(1000*10)] public void IsMatrixMultiplicationPerformant(string leftMatrixKey, string rightMatrixKey) { var leftMatrix = _matrices[leftMatrixKey]; var rightMatrix = _matrices[rightMatrixKey]; - var result = leftMatrix * rightMatrix; + var result = leftMatrix*rightMatrix; Assert.That(result, Is.Not.Null); } @@ -1714,7 +1718,7 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Single /// number of columns. /// array to check. /// matrix to check against. - private static void NotModified(int rows, int columns, IList array, Matrix matrix) + static void NotModified(int rows, int columns, IList array, Matrix matrix) { var index = 0; for (var col = 0; col < columns; col++)