|
|
|
@ -4,7 +4,7 @@ |
|
|
|
// http://github.com/mathnet/mathnet-numerics
|
|
|
|
// http://mathnetnumerics.codeplex.com
|
|
|
|
//
|
|
|
|
// Copyright (c) 2009-2013 Math.NET
|
|
|
|
// Copyright (c) 2009-2015 Math.NET
|
|
|
|
//
|
|
|
|
// Permission is hereby granted, free of charge, to any person
|
|
|
|
// obtaining a copy of this software and associated documentation
|
|
|
|
@ -433,72 +433,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex |
|
|
|
AssertHelpers.AlmostEqualRelative(a[8], -0.113636363636364, 13); |
|
|
|
} |
|
|
|
|
|
|
|
#if ! MKL
|
|
|
|
/// <summary>
|
|
|
|
/// Can compute the inverse of a matrix using LU factorization
|
|
|
|
/// with a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanComputeLuInverseWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Square3x3"]; |
|
|
|
var a = new Complex[matrix.RowCount*matrix.RowCount]; |
|
|
|
Array.Copy(matrix.Values, a, a.Length); |
|
|
|
|
|
|
|
#if CUDA
|
|
|
|
Complex[] work = null; |
|
|
|
#else
|
|
|
|
var work = new Complex[matrix.RowCount]; |
|
|
|
#endif
|
|
|
|
Control.LinearAlgebraProvider.LUInverse(a, matrix.RowCount, work); |
|
|
|
|
|
|
|
AssertHelpers.AlmostEqualRelative(a[0], -0.454545454545454, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[1], -0.909090909090908, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[2], 0.454545454545454, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[3], -0.340909090909090, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[4], -2.045454545454543, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[5], 1.477272727272726, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[6], -0.113636363636364, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[7], 0.227272727272727, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[8], -0.113636363636364, 13); |
|
|
|
} |
|
|
|
#endif
|
|
|
|
|
|
|
|
#if ! MKL
|
|
|
|
/// <summary>
|
|
|
|
/// Can compute the inverse of a matrix using LU factorization
|
|
|
|
/// using a previously factored matrix with a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanComputeLuInverseOnFactoredMatrixWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Square3x3"]; |
|
|
|
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); |
|
|
|
|
|
|
|
#if CUDA
|
|
|
|
Complex[] work = null; |
|
|
|
#else
|
|
|
|
var work = new Complex[matrix.RowCount]; |
|
|
|
#endif
|
|
|
|
Control.LinearAlgebraProvider.LUInverseFactored(a, matrix.RowCount, ipiv, work); |
|
|
|
|
|
|
|
AssertHelpers.AlmostEqualRelative(a[0], -0.454545454545454, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[1], -0.909090909090908, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[2], 0.454545454545454, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[3], -0.340909090909090, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[4], -2.045454545454543, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[5], 1.477272727272726, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[6], -0.113636363636364, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[7], 0.227272727272727, 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(a[8], -0.113636363636364, 13); |
|
|
|
} |
|
|
|
#endif
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using LU factorization.
|
|
|
|
/// </summary>
|
|
|
|
@ -696,92 +630,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#if ! MKL
|
|
|
|
/// <summary>
|
|
|
|
/// Can compute QR factorization of a square matrix using a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanComputeQRFactorSquareMatrixWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Square3x3"]; |
|
|
|
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]; |
|
|
|
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; |
|
|
|
|
|
|
|
for (var row = 0; row < matrix.RowCount; row++) |
|
|
|
{ |
|
|
|
for (var col = 0; col < matrix.ColumnCount; col++) |
|
|
|
{ |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[row, col], a[row, col], 14); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can compute QR factorization of a tall matrix using a work matrix.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanComputeQRFactorTallMatrixWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Tall3x2"]; |
|
|
|
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]; |
|
|
|
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; |
|
|
|
|
|
|
|
for (var row = 0; row < matrix.RowCount; row++) |
|
|
|
{ |
|
|
|
for (var col = 0; col < matrix.ColumnCount; col++) |
|
|
|
{ |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[row, col], a[row, col], 14); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can compute QR factorization of a wide matrix using a work matrix.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanComputeQRFactorWideMatrixWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Wide2x3"]; |
|
|
|
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]; |
|
|
|
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; |
|
|
|
|
|
|
|
for (var row = 0; row < matrix.RowCount; row++) |
|
|
|
{ |
|
|
|
for (var col = 0; col < matrix.ColumnCount; col++) |
|
|
|
{ |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[row, col], a[row, col], 14); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
#endif
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can compute thin QR factorization of a square matrix.
|
|
|
|
/// </summary>
|
|
|
|
@ -836,63 +684,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#if ! MKL
|
|
|
|
/// <summary>
|
|
|
|
/// Can compute thin QR factorization of a square matrix using a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanComputeThinQRFactorSquareMatrixWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Square3x3"]; |
|
|
|
var r = new Complex[matrix.ColumnCount*matrix.ColumnCount]; |
|
|
|
var tau = new Complex[3]; |
|
|
|
var q = new Complex[matrix.RowCount*matrix.ColumnCount]; |
|
|
|
Array.Copy(matrix.Values, q, q.Length); |
|
|
|
|
|
|
|
var work = new Complex[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++) |
|
|
|
{ |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[row, col], a[row, col], 14); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can compute thin QR factorization of a tall matrix using a work matrix.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanComputeThinQRFactorTallMatrixWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Tall3x2"]; |
|
|
|
var r = new Complex[matrix.ColumnCount*matrix.ColumnCount]; |
|
|
|
var tau = new Complex[3]; |
|
|
|
var q = new Complex[matrix.RowCount*matrix.ColumnCount]; |
|
|
|
Array.Copy(matrix.Values, q, q.Length); |
|
|
|
|
|
|
|
var work = new Complex[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++) |
|
|
|
{ |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[row, col], a[row, col], 14); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
#endif
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using QR factorization with a square A matrix.
|
|
|
|
/// </summary>
|
|
|
|
@ -944,94 +735,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex |
|
|
|
AssertHelpers.AlmostEqualRelative(test[1, 1], x[3], 13); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#if ! MKL
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using QR factorization with a square A matrix
|
|
|
|
/// using a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanSolveUsingQRSquareMatrixUsingWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Square3x3"]; |
|
|
|
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]; |
|
|
|
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.AlmostEqualRelative(mb[0, 0], b[0], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[1, 0], b[1], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[2, 0], b[2], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[0, 1], b[3], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[1, 1], b[4], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[2, 1], b[5], 13); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using QR factorization with a tall A matrix
|
|
|
|
/// using a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanSolveUsingQRTallMatrixUsingWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Tall3x2"]; |
|
|
|
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]; |
|
|
|
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.AlmostEqualRelative(test[0, 0], x[0], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(test[1, 0], x[1], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(test[0, 1], x[2], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(test[1, 1], x[3], 13); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using QR factorization with a square A matrix
|
|
|
|
/// using a factored A matrix.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanSolveUsingQRSquareMatrixOnFactoredMatrix() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Square3x3"]; |
|
|
|
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]; |
|
|
|
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]; |
|
|
|
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.AlmostEqualRelative(mb[0, 0], b[0], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[1, 0], b[1], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[2, 0], b[2], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[0, 1], b[3], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[1, 1], b[4], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[2, 1], b[5], 13); |
|
|
|
} |
|
|
|
#endif
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using QR factorization with a tall A matrix
|
|
|
|
/// using a factored A matrix.
|
|
|
|
@ -1060,68 +763,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex |
|
|
|
AssertHelpers.AlmostEqualRelative(test[1, 1], x[3], 13); |
|
|
|
} |
|
|
|
|
|
|
|
#if ! MKL
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using QR factorization with a square A matrix
|
|
|
|
/// using a factored A matrix with a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanSolveUsingQRSquareMatrixOnFactoredMatrixWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Square3x3"]; |
|
|
|
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 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]; |
|
|
|
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.AlmostEqualRelative(mb[0, 0], b[0], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[1, 0], b[1], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[2, 0], b[2], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[0, 1], b[3], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[1, 1], b[4], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[2, 1], b[5], 13); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using QR factorization with a tall A matrix
|
|
|
|
/// using a factored A matrix with a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanSolveUsingQRTallMatrixOnFactoredMatrixWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Tall3x2"]; |
|
|
|
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 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]; |
|
|
|
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.AlmostEqualRelative(test[0, 0], x[0], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(test[1, 0], x[1], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(test[0, 1], x[2], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(test[1, 1], x[3], 13); |
|
|
|
} |
|
|
|
#endif
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using thin QR factorization with a square A matrix.
|
|
|
|
/// </summary>
|
|
|
|
@ -1174,64 +815,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex |
|
|
|
AssertHelpers.AlmostEqualRelative(test[1, 1], x[3], 13); |
|
|
|
} |
|
|
|
|
|
|
|
#if ! MKL
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using thin QR factorization with a square A matrix
|
|
|
|
/// using a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanSolveUsingThinQRSquareMatrixUsingWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Square3x3"]; |
|
|
|
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]; |
|
|
|
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.AlmostEqualRelative(mb[0, 0], b[0], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[1, 0], b[1], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[2, 0], b[2], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[0, 1], b[3], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[1, 1], b[4], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[2, 1], b[5], 13); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using thin QR factorization with a tall A matrix
|
|
|
|
/// using a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanSolveUsingThinQRTallMatrixUsingWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Tall3x2"]; |
|
|
|
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]; |
|
|
|
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.AlmostEqualRelative(test[0, 0], x[0], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(test[1, 0], x[1], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(test[0, 1], x[2], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(test[1, 1], x[3], 13); |
|
|
|
} |
|
|
|
#endif
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using thin QR factorization with a square A matrix
|
|
|
|
/// using a factored A matrix.
|
|
|
|
@ -1290,66 +873,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex |
|
|
|
AssertHelpers.AlmostEqualRelative(test[1, 1], x[3], 13); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using thin QR factorization with a square A matrix
|
|
|
|
/// using a factored A matrix with a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanSolveUsingThinQRSquareMatrixOnFactoredMatrixWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Square3x3"]; |
|
|
|
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 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]; |
|
|
|
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.AlmostEqualRelative(mb[0, 0], b[0], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[1, 0], b[1], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[2, 0], b[2], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[0, 1], b[3], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[1, 1], b[4], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(mb[2, 1], b[5], 13); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using thin QR factorization with a tall A matrix
|
|
|
|
/// using a factored A matrix with a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanSolveUsingThinQRTallMatrixOnFactoredMatrixWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Tall3x2"]; |
|
|
|
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 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]; |
|
|
|
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.AlmostEqualRelative(test[0, 0], x[0], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(test[1, 0], x[1], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(test[0, 1], x[2], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(test[1, 1], x[3], 13); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can compute the SVD factorization of a square matrix.
|
|
|
|
/// </summary>
|
|
|
|
@ -1455,129 +978,6 @@ namespace MathNet.Numerics.UnitTests.LinearAlgebraProviderTests.Complex |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[1, 2], result[1, 2], 14); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can compute the SVD factorization of a square matrix using
|
|
|
|
/// a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanComputeSVDFactorizationOfSquareMatrixWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Square3x3"]; |
|
|
|
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]; |
|
|
|
#if CUDA
|
|
|
|
Complex[] work = null; |
|
|
|
#else
|
|
|
|
var work = new Complex[100]; |
|
|
|
#endif
|
|
|
|
|
|
|
|
Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); |
|
|
|
|
|
|
|
var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); |
|
|
|
for (var index = 0; index < s.Length; index++) |
|
|
|
{ |
|
|
|
w[index, index] = s[index]; |
|
|
|
} |
|
|
|
|
|
|
|
var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); |
|
|
|
var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); |
|
|
|
var result = mU*w*mV; |
|
|
|
|
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[0, 0], result[0, 0], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[1, 0], result[1, 0], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[2, 0], result[2, 0], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[0, 1], result[0, 1], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[1, 1], result[1, 1], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[2, 1], result[2, 1], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[0, 2], result[0, 2], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[1, 2], result[1, 2], 13); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[2, 2], result[2, 2], 13); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can compute the SVD factorization of a tall matrix using
|
|
|
|
/// a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanComputeSVDFactorizationOfTallMatrixWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Tall3x2"]; |
|
|
|
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]; |
|
|
|
#if CUDA
|
|
|
|
Complex[] work = null; |
|
|
|
#else
|
|
|
|
var work = new Complex[100]; |
|
|
|
#endif
|
|
|
|
|
|
|
|
Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); |
|
|
|
|
|
|
|
var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); |
|
|
|
for (var index = 0; index < s.Length; index++) |
|
|
|
{ |
|
|
|
w[index, index] = s[index]; |
|
|
|
} |
|
|
|
|
|
|
|
var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); |
|
|
|
var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); |
|
|
|
var result = mU*w*mV; |
|
|
|
|
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[0, 0], result[0, 0], 14); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[1, 0], result[1, 0], 14); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[2, 0], result[2, 0], 14); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[0, 1], result[0, 1], 14); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[1, 1], result[1, 1], 14); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[2, 1], result[2, 1], 14); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can compute the SVD factorization of a wide matrix using
|
|
|
|
/// a work array.
|
|
|
|
/// </summary>
|
|
|
|
[Test] |
|
|
|
public void CanComputeSVDFactorizationOfWideMatrixWithWorkArray() |
|
|
|
{ |
|
|
|
var matrix = _matrices["Wide2x3"]; |
|
|
|
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]; |
|
|
|
#if CUDA
|
|
|
|
Complex[] work = null; |
|
|
|
#else
|
|
|
|
var work = new Complex[100]; |
|
|
|
#endif
|
|
|
|
|
|
|
|
Control.LinearAlgebraProvider.SingularValueDecomposition(true, a, matrix.RowCount, matrix.ColumnCount, s, u, vt, work); |
|
|
|
|
|
|
|
var w = new DenseMatrix(matrix.RowCount, matrix.ColumnCount); |
|
|
|
for (var index = 0; index < s.Length; index++) |
|
|
|
{ |
|
|
|
w[index, index] = s[index]; |
|
|
|
} |
|
|
|
|
|
|
|
var mU = new DenseMatrix(matrix.RowCount, matrix.RowCount, u); |
|
|
|
var mV = new DenseMatrix(matrix.ColumnCount, matrix.ColumnCount, vt); |
|
|
|
var result = mU*w*mV; |
|
|
|
|
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[0, 0], result[0, 0], 14); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[1, 0], result[1, 0], 14); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[0, 1], result[0, 1], 14); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[1, 1], result[1, 1], 14); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[0, 2], result[0, 2], 14); |
|
|
|
AssertHelpers.AlmostEqualRelative(matrix[1, 2], result[1, 2], 14); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Can solve Ax=b using SVD factorization with a square A matrix.
|
|
|
|
/// </summary>
|
|
|
|
|