public void CanSolveUsingQRTallMatrix() { var matrix = _matrices["Tall3x2"]; 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]; 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; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); AssertHelpers.AlmostEqual(test[0, 1], x[2], 6); AssertHelpers.AlmostEqual(test[1, 1], x[3], 6); }
public void CanSolveUsingQRSquareMatrixUsingWorkArray() { var matrix = _matrices["Square3x3"]; 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]; 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], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); AssertHelpers.AlmostEqual(mb[2, 0], b[2], 5); AssertHelpers.AlmostEqual(mb[0, 1], b[3], 5); AssertHelpers.AlmostEqual(mb[1, 1], b[4], 5); AssertHelpers.AlmostEqual(mb[2, 1], b[5], 5); }
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 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); AssertHelpers.AlmostEqual(b[1], 1, 6); AssertHelpers.AlmostEqual(b[2], 0, 6); AssertHelpers.AlmostEqual(b[3], 3, 6); AssertHelpers.AlmostEqual(b[4], 1, 6); AssertHelpers.AlmostEqual(b[5], 0, 6); NotModified(3, 3, a, matrix); }
public void CanSolveUsingCholeskyOnFactoredMatrix() { 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}; Control.LinearAlgebraProvider.CholeskySolveFactored(a, 3, b, 2); AssertHelpers.AlmostEqual(b[0], 0, 6); AssertHelpers.AlmostEqual(b[1], 1, 6); AssertHelpers.AlmostEqual(b[2], 0, 6); AssertHelpers.AlmostEqual(b[3], 3, 6); AssertHelpers.AlmostEqual(b[4], 1, 6); AssertHelpers.AlmostEqual(b[5], 0, 6); }
public void CanSolveUsingSVDTallMatrixOnFactoredMatrix() { var matrix = _matrices["Tall3x2"]; 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]; 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]; 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; AssertHelpers.AlmostEqual(test[0, 0], x[0], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); AssertHelpers.AlmostEqual(test[0, 1], x[2], 6); AssertHelpers.AlmostEqual(test[1, 1], x[3], 6); }
public void CanSolveUsingLUOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; 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}; Control.LinearAlgebraProvider.LUSolveFactored(2, a, matrix.RowCount, ipiv, b); AssertHelpers.AlmostEqual(b[0], -1.477272727272726, 6); AssertHelpers.AlmostEqual(b[1], -4.318181818181815, 6); AssertHelpers.AlmostEqual(b[2], 3.068181818181816, 6); AssertHelpers.AlmostEqual(b[3], -4.204545454545451, 6); AssertHelpers.AlmostEqual(b[4], -12.499999999999989, 6); AssertHelpers.AlmostEqual(b[5], 8.522727272727266, 6); }
public void CanSolveUsingThinQRTallMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Tall3x2"]; 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 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]; 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], 6); AssertHelpers.AlmostEqual(test[1, 0], x[1], 6); AssertHelpers.AlmostEqual(test[0, 1], x[2], 6); AssertHelpers.AlmostEqual(test[1, 1], x[3], 6); }
public void CanSolveUsingSVDSquareMatrixOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; 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]; 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]; 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; AssertHelpers.AlmostEqual(mb[0, 0], b[0], 6); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 6); AssertHelpers.AlmostEqual(mb[2, 0], b[2], 5); AssertHelpers.AlmostEqual(mb[0, 1], b[3], 5); AssertHelpers.AlmostEqual(mb[1, 1], b[4], 5); AssertHelpers.AlmostEqual(mb[2, 1], b[5], 5); }
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); 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); }
public void CanSolveUsingThinQRSquareMatrixOnFactoredMatrixWithWorkArray() { var matrix = _matrices["Square3x3"]; 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 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]; 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], 5); AssertHelpers.AlmostEqual(mb[1, 0], b[1], 5); AssertHelpers.AlmostEqual(mb[2, 0], b[2], 5); AssertHelpers.AlmostEqual(mb[0, 1], b[3], 5); AssertHelpers.AlmostEqual(mb[1, 1], b[4], 5); AssertHelpers.AlmostEqual(mb[2, 1], b[5], 5); }
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); 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); }
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); NotModified(3, 2, a, matrix); 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); }
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 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; 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); }
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); }
public void CanSolveUsingCholeskyOnFactoredMatrix() { 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}; 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); }