public void CanSolveUsingQRTallMatrixUsingWorkArray() { 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]; 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; 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 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 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 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 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 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 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 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 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 CanSolveUsingLU() { var matrix = _matrices["Square3x3"]; 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 }; Control.LinearAlgebraProvider.LUSolve(2, a, matrix.RowCount, b); AssertHelpers.AlmostEqual(b[0], -1.477272727272726f, 6); AssertHelpers.AlmostEqual(b[1], -4.318181818181815f, 6); AssertHelpers.AlmostEqual(b[2], 3.068181818181816f, 6); AssertHelpers.AlmostEqual(b[3], -4.204545454545451f, 6); AssertHelpers.AlmostEqual(b[4], -12.499999999999989f, 6); AssertHelpers.AlmostEqual(b[5], 8.522727272727266f, 6); NotModified(matrix.RowCount, matrix.ColumnCount, a, matrix); }
public void CanSolveUsingQRTallMatrixOnFactoredMatrix() { var matrix = _matrices["Tall3x2"]; 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]; 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]; 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], 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 CanSolveUsingQRSquareMatrixOnFactoredMatrix() { var matrix = _matrices["Square3x3"]; 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]; 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]; 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], 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 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); 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 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); }