diff --git a/src/Numerics/LinearAlgebra/Builder.cs b/src/Numerics/LinearAlgebra/Builder.cs index 615c6552..955ede5d 100644 --- a/src/Numerics/LinearAlgebra/Builder.cs +++ b/src/Numerics/LinearAlgebra/Builder.cs @@ -395,7 +395,7 @@ namespace MathNet.Numerics.LinearAlgebra { var storage = example.Storage; if (storage is DenseColumnMajorMatrixStorage) return Dense(rows, columns); - if (!fullyMutable && storage is DiagonalMatrixStorage) return Diagonal(rows, columns); + if (storage is DiagonalMatrixStorage) return fullyMutable ? Sparse(rows, columns) : Diagonal(rows, columns); if (storage is SparseCompressedRowMatrixStorage) return Sparse(rows, columns); return Dense(rows, columns); } @@ -424,7 +424,7 @@ namespace MathNet.Numerics.LinearAlgebra var storage1 = example.Storage; var storage2 = otherExample.Storage; if (storage1 is DenseColumnMajorMatrixStorage || storage2 is DenseColumnMajorMatrixStorage) return Dense(rows, columns); - if (!fullyMutable && storage1 is DiagonalMatrixStorage && storage2 is DiagonalMatrixStorage) return Diagonal(rows, columns); + if (storage1 is DiagonalMatrixStorage && storage2 is DiagonalMatrixStorage) return fullyMutable ? Sparse(rows, columns) : Diagonal(rows, columns); if (storage1 is SparseCompressedRowMatrixStorage || storage2 is SparseCompressedRowMatrixStorage) return Sparse(rows, columns); return Dense(rows, columns); } @@ -1331,6 +1331,14 @@ namespace MathNet.Numerics.LinearAlgebra return example.Storage.IsDense || otherExample.Storage.IsDense ? Dense(example.Count) : Sparse(example.Count); } + /// + /// Create a new vector with a type that can represent and is closest to both provided samples. + /// + public Vector SameAs(Matrix matrix, Vector vector, int length) + { + return matrix.Storage.IsDense || vector.Storage.IsDense ? Dense(length) : Sparse(length); + } + /// /// Create a new dense vector with values sampled from the provided random distribution. /// diff --git a/src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs b/src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs index 7d4f31a2..b6e3b44d 100644 --- a/src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs +++ b/src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs @@ -531,7 +531,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, rightSide, "rightSide"); } - var ret = Vector.Build.SameAs(this, RowCount); + var ret = Vector.Build.SameAs(this, rightSide, RowCount); DoMultiply(rightSide, ret); return ret; } @@ -580,7 +580,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, leftSide, "leftSide"); } - var ret = Vector.Build.SameAs(this, ColumnCount); + var ret = Vector.Build.SameAs(this, leftSide, ColumnCount); DoLeftMultiply(leftSide, ret); return ret; } @@ -727,7 +727,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, rightSide, "rightSide"); } - var result = Vector.Build.SameAs(this, ColumnCount); + var result = Vector.Build.SameAs(this, rightSide, ColumnCount); DoTransposeThisAndMultiply(rightSide, result); return result; } @@ -926,7 +926,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, other, "other"); } - var result = Build.SameAs(this); + var result = Build.SameAs(this, other); DoPointwiseMultiply(other, result); return result; } @@ -961,7 +961,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, divisor); } - var result = Build.SameAs(this); + var result = Build.SameAs(this, divisor); DoPointwiseDivide(divisor, result); return result; } @@ -996,7 +996,7 @@ namespace MathNet.Numerics.LinearAlgebra throw DimensionsDontMatch(this, divisor); } - var result = Build.SameAs(this); + var result = Build.SameAs(this, divisor); DoPointwiseModulus(divisor, result); return result; } @@ -1074,7 +1074,7 @@ namespace MathNet.Numerics.LinearAlgebra /// The kronecker product of the two matrices. public Matrix KroneckerProduct(Matrix other) { - var result = Build.SameAs(this, RowCount*other.RowCount, ColumnCount*other.ColumnCount); + var result = Build.SameAs(this, other, RowCount*other.RowCount, ColumnCount*other.ColumnCount); KroneckerProduct(other, result); return result; } diff --git a/src/Numerics/LinearAlgebra/Matrix.cs b/src/Numerics/LinearAlgebra/Matrix.cs index 543799bf..b349f593 100644 --- a/src/Numerics/LinearAlgebra/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Matrix.cs @@ -1176,7 +1176,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentNullException("lower"); } - var result = Build.SameAs(this, lower, RowCount + lower.RowCount, ColumnCount + lower.ColumnCount); + var result = Build.SameAs(this, lower, RowCount + lower.RowCount, ColumnCount + lower.ColumnCount, RowCount != ColumnCount); Storage.CopySubMatrixToUnchecked(result.Storage, 0, 0, RowCount, 0, 0, ColumnCount); lower.Storage.CopySubMatrixToUnchecked(result.Storage, 0, RowCount, lower.RowCount, 0, ColumnCount, lower.ColumnCount); return result; diff --git a/src/Numerics/LinearAlgebra/Vector.Arithmetic.cs b/src/Numerics/LinearAlgebra/Vector.Arithmetic.cs index 53f6859a..5f3f5531 100644 --- a/src/Numerics/LinearAlgebra/Vector.Arithmetic.cs +++ b/src/Numerics/LinearAlgebra/Vector.Arithmetic.cs @@ -218,7 +218,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentException(Resources.ArgumentVectorsSameLength, "other"); } - var result = Build.SameAs(this); + var result = Build.SameAs(this, other); DoAdd(other, result); return result; } @@ -346,7 +346,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentException(Resources.ArgumentVectorsSameLength, "other"); } - var result = Build.SameAs(this); + var result = Build.SameAs(this, other); DoSubtract(other, result); return result; } @@ -606,7 +606,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentException(Resources.ArgumentVectorsSameLength, "other"); } - var result = Build.SameAs(this); + var result = Build.SameAs(this, other); DoPointwiseMultiply(other, result); return result; } @@ -646,7 +646,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentException(Resources.ArgumentVectorsSameLength, "divisor"); } - var result = Build.SameAs(this); + var result = Build.SameAs(this, divisor); DoPointwiseDivide(divisor, result); return result; } @@ -686,7 +686,7 @@ namespace MathNet.Numerics.LinearAlgebra throw new ArgumentException(Resources.ArgumentVectorsSameLength, "divisor"); } - var result = Build.SameAs(this); + var result = Build.SameAs(this, divisor); DoPointwiseModulus(divisor, result); return result; } diff --git a/src/UnitTests/LinearAlgebraTests/Complex/ReturnTypeTests.cs b/src/UnitTests/LinearAlgebraTests/Complex/ReturnTypeTests.cs new file mode 100644 index 00000000..17cf89f9 --- /dev/null +++ b/src/UnitTests/LinearAlgebraTests/Complex/ReturnTypeTests.cs @@ -0,0 +1,226 @@ +using MathNet.Numerics.LinearAlgebra; +using MathNet.Numerics.LinearAlgebra.Complex; +using NUnit.Framework; + +namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex +{ +#if NOSYSNUMERICS + using Complex = Numerics.Complex; +#else + using Complex = System.Numerics.Complex; +#endif + + [TestFixture] + public class ReturnTypeTests + { + readonly Vector _vectorDense = Vector.Build.Dense(3); + readonly Vector _vectorSparse = Vector.Build.Sparse(3); + readonly Matrix _matrixDense = Matrix.Build.Dense(3, 3); + readonly Matrix _matrixSparse = Matrix.Build.Sparse(3, 3); + readonly Matrix _matrixDiagonal = Matrix.Build.Diagonal(3, 3); + + [Test] + public void VerifyExamples() + { + Assert.That(_vectorDense, Is.TypeOf()); + Assert.That(_vectorSparse, Is.TypeOf()); + Assert.That(_matrixDense, Is.TypeOf()); + Assert.That(_matrixSparse, Is.TypeOf()); + Assert.That(_matrixDiagonal, Is.TypeOf()); + } + + [Test] + public void Negate() + { + Assert.That(_vectorDense.Negate(), Is.InstanceOf()); + Assert.That(_vectorSparse.Negate(), Is.InstanceOf()); + Assert.That(_matrixDense.Negate(), Is.InstanceOf()); + Assert.That(_matrixSparse.Negate(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Negate(), Is.InstanceOf()); + } + + [Test] + public void Conjugate() + { + Assert.That(_vectorDense.Conjugate(), Is.InstanceOf()); + Assert.That(_vectorSparse.Conjugate(), Is.InstanceOf()); + Assert.That(_matrixDense.Conjugate(), Is.InstanceOf()); + Assert.That(_matrixSparse.Conjugate(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Conjugate(), Is.InstanceOf()); + } + + [Test] + public void Transpose() + { + Assert.That(_matrixDense.Transpose(), Is.InstanceOf()); + Assert.That(_matrixSparse.Transpose(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Transpose(), Is.InstanceOf()); + } + + [Test] + public void ConjugateTranspose() + { + Assert.That(_matrixDense.ConjugateTranspose(), Is.InstanceOf()); + Assert.That(_matrixSparse.ConjugateTranspose(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.ConjugateTranspose(), Is.InstanceOf()); + } + + [Test] + public void Add() + { + Assert.That(_vectorDense + _vectorDense, Is.InstanceOf()); + Assert.That(_vectorDense + _vectorSparse, Is.InstanceOf()); + Assert.That(_vectorSparse + _vectorDense, Is.InstanceOf()); + Assert.That(_vectorSparse + _vectorSparse, Is.InstanceOf()); + Assert.That(_matrixDense + _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDense + _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDense + _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixSparse + _matrixDense, Is.InstanceOf()); + Assert.That(_matrixSparse + _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixSparse + _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixDiagonal + _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal + _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal + _matrixDiagonal, Is.InstanceOf()); + } + + [Test] + public void Subtract() + { + Assert.That(_vectorDense - _vectorDense, Is.InstanceOf()); + Assert.That(_vectorDense - _vectorSparse, Is.InstanceOf()); + Assert.That(_vectorSparse - _vectorDense, Is.InstanceOf()); + Assert.That(_vectorSparse - _vectorSparse, Is.InstanceOf()); + Assert.That(_matrixDense - _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDense - _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDense - _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixSparse - _matrixDense, Is.InstanceOf()); + Assert.That(_matrixSparse - _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixSparse - _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixDiagonal - _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal - _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal - _matrixDiagonal, Is.InstanceOf()); + } + + [Test] + public void PointwiseMultiply() + { + Assert.That(_vectorDense.PointwiseMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_vectorDense.PointwiseMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_vectorSparse.PointwiseMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_vectorSparse.PointwiseMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_matrixDense.PointwiseMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.PointwiseMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.PointwiseMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.PointwiseMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.PointwiseMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.PointwiseMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.PointwiseMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.PointwiseMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.PointwiseMultiply(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void MatrixMultiply() + { + Assert.That(_matrixDense*_matrixDense, Is.InstanceOf()); + Assert.That(_matrixDense*_matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDense*_matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixSparse*_matrixDense, Is.InstanceOf()); + Assert.That(_matrixSparse*_matrixSparse, Is.InstanceOf()); + Assert.That(_matrixSparse*_matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_matrixDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_matrixDiagonal, Is.InstanceOf()); + + Assert.That(_matrixDense.TransposeThisAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeThisAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeThisAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_matrixDiagonal), Is.InstanceOf()); + + Assert.That(_matrixDense.TransposeAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeAndMultiply(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void MatrixVectorMultiply() + { + Assert.That(_matrixDense*_vectorDense, Is.InstanceOf()); + Assert.That(_matrixDense*_vectorSparse, Is.InstanceOf()); + Assert.That(_matrixSparse*_vectorDense, Is.InstanceOf()); + Assert.That(_matrixSparse*_vectorSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_vectorDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_vectorSparse, Is.InstanceOf()); + + Assert.That(_vectorDense*_matrixDense, Is.InstanceOf()); + Assert.That(_vectorSparse*_matrixDense, Is.InstanceOf()); + Assert.That(_vectorDense*_matrixSparse, Is.InstanceOf()); + Assert.That(_vectorSparse*_matrixSparse, Is.InstanceOf()); + Assert.That(_vectorDense*_matrixDiagonal, Is.InstanceOf()); + Assert.That(_vectorSparse*_matrixDiagonal, Is.InstanceOf()); + + Assert.That(_matrixDense.TransposeThisAndMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeThisAndMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_vectorSparse), Is.InstanceOf()); + } + + [Test] + public void Append() + { + Assert.That(_matrixDense.Append(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.Append(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.Append(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.Append(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.Append(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.Append(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Append(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Append(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Append(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void Stack() + { + Assert.That(_matrixDense.Stack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.Stack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.Stack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.Stack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.Stack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.Stack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Stack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Stack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Stack(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void DiagonalStack() + { + Assert.That(_matrixDense.DiagonalStack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.DiagonalStack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.DiagonalStack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.DiagonalStack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.DiagonalStack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.DiagonalStack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + + // Special Case + Assert.That(Matrix.Build.DiagonalIdentity(2, 4).DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + } + } +} diff --git a/src/UnitTests/LinearAlgebraTests/Complex32/ReturnTypeTests.cs b/src/UnitTests/LinearAlgebraTests/Complex32/ReturnTypeTests.cs new file mode 100644 index 00000000..264c6ef7 --- /dev/null +++ b/src/UnitTests/LinearAlgebraTests/Complex32/ReturnTypeTests.cs @@ -0,0 +1,222 @@ +using MathNet.Numerics.LinearAlgebra; +using MathNet.Numerics.LinearAlgebra.Complex32; +using NUnit.Framework; + +namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Complex32 +{ + using Numerics; + + [TestFixture] + public class ReturnTypeTests + { + readonly Vector _vectorDense = Vector.Build.Dense(3); + readonly Vector _vectorSparse = Vector.Build.Sparse(3); + readonly Matrix _matrixDense = Matrix.Build.Dense(3, 3); + readonly Matrix _matrixSparse = Matrix.Build.Sparse(3, 3); + readonly Matrix _matrixDiagonal = Matrix.Build.Diagonal(3, 3); + + [Test] + public void VerifyExamples() + { + Assert.That(_vectorDense, Is.TypeOf()); + Assert.That(_vectorSparse, Is.TypeOf()); + Assert.That(_matrixDense, Is.TypeOf()); + Assert.That(_matrixSparse, Is.TypeOf()); + Assert.That(_matrixDiagonal, Is.TypeOf()); + } + + [Test] + public void Negate() + { + Assert.That(_vectorDense.Negate(), Is.InstanceOf()); + Assert.That(_vectorSparse.Negate(), Is.InstanceOf()); + Assert.That(_matrixDense.Negate(), Is.InstanceOf()); + Assert.That(_matrixSparse.Negate(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Negate(), Is.InstanceOf()); + } + + [Test] + public void Conjugate() + { + Assert.That(_vectorDense.Conjugate(), Is.InstanceOf()); + Assert.That(_vectorSparse.Conjugate(), Is.InstanceOf()); + Assert.That(_matrixDense.Conjugate(), Is.InstanceOf()); + Assert.That(_matrixSparse.Conjugate(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Conjugate(), Is.InstanceOf()); + } + + [Test] + public void Transpose() + { + Assert.That(_matrixDense.Transpose(), Is.InstanceOf()); + Assert.That(_matrixSparse.Transpose(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Transpose(), Is.InstanceOf()); + } + + [Test] + public void ConjugateTranspose() + { + Assert.That(_matrixDense.ConjugateTranspose(), Is.InstanceOf()); + Assert.That(_matrixSparse.ConjugateTranspose(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.ConjugateTranspose(), Is.InstanceOf()); + } + + [Test] + public void Add() + { + Assert.That(_vectorDense + _vectorDense, Is.InstanceOf()); + Assert.That(_vectorDense + _vectorSparse, Is.InstanceOf()); + Assert.That(_vectorSparse + _vectorDense, Is.InstanceOf()); + Assert.That(_vectorSparse + _vectorSparse, Is.InstanceOf()); + Assert.That(_matrixDense + _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDense + _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDense + _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixSparse + _matrixDense, Is.InstanceOf()); + Assert.That(_matrixSparse + _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixSparse + _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixDiagonal + _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal + _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal + _matrixDiagonal, Is.InstanceOf()); + } + + [Test] + public void Subtract() + { + Assert.That(_vectorDense - _vectorDense, Is.InstanceOf()); + Assert.That(_vectorDense - _vectorSparse, Is.InstanceOf()); + Assert.That(_vectorSparse - _vectorDense, Is.InstanceOf()); + Assert.That(_vectorSparse - _vectorSparse, Is.InstanceOf()); + Assert.That(_matrixDense - _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDense - _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDense - _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixSparse - _matrixDense, Is.InstanceOf()); + Assert.That(_matrixSparse - _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixSparse - _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixDiagonal - _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal - _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal - _matrixDiagonal, Is.InstanceOf()); + } + + [Test] + public void PointwiseMultiply() + { + Assert.That(_vectorDense.PointwiseMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_vectorDense.PointwiseMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_vectorSparse.PointwiseMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_vectorSparse.PointwiseMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_matrixDense.PointwiseMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.PointwiseMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.PointwiseMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.PointwiseMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.PointwiseMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.PointwiseMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.PointwiseMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.PointwiseMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.PointwiseMultiply(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void MatrixMultiply() + { + Assert.That(_matrixDense*_matrixDense, Is.InstanceOf()); + Assert.That(_matrixDense*_matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDense*_matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixSparse*_matrixDense, Is.InstanceOf()); + Assert.That(_matrixSparse*_matrixSparse, Is.InstanceOf()); + Assert.That(_matrixSparse*_matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_matrixDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_matrixDiagonal, Is.InstanceOf()); + + Assert.That(_matrixDense.TransposeThisAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeThisAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeThisAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_matrixDiagonal), Is.InstanceOf()); + + Assert.That(_matrixDense.TransposeAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeAndMultiply(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void MatrixVectorMultiply() + { + Assert.That(_matrixDense*_vectorDense, Is.InstanceOf()); + Assert.That(_matrixDense*_vectorSparse, Is.InstanceOf()); + Assert.That(_matrixSparse*_vectorDense, Is.InstanceOf()); + Assert.That(_matrixSparse*_vectorSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_vectorDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_vectorSparse, Is.InstanceOf()); + + Assert.That(_vectorDense*_matrixDense, Is.InstanceOf()); + Assert.That(_vectorSparse*_matrixDense, Is.InstanceOf()); + Assert.That(_vectorDense*_matrixSparse, Is.InstanceOf()); + Assert.That(_vectorSparse*_matrixSparse, Is.InstanceOf()); + Assert.That(_vectorDense*_matrixDiagonal, Is.InstanceOf()); + Assert.That(_vectorSparse*_matrixDiagonal, Is.InstanceOf()); + + Assert.That(_matrixDense.TransposeThisAndMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeThisAndMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_vectorSparse), Is.InstanceOf()); + } + + [Test] + public void Append() + { + Assert.That(_matrixDense.Append(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.Append(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.Append(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.Append(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.Append(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.Append(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Append(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Append(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Append(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void Stack() + { + Assert.That(_matrixDense.Stack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.Stack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.Stack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.Stack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.Stack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.Stack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Stack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Stack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Stack(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void DiagonalStack() + { + Assert.That(_matrixDense.DiagonalStack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.DiagonalStack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.DiagonalStack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.DiagonalStack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.DiagonalStack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.DiagonalStack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + + // Special Case + Assert.That(Matrix.Build.DiagonalIdentity(2, 4).DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + } + } +} diff --git a/src/UnitTests/LinearAlgebraTests/Double/ReturnTypeTests.cs b/src/UnitTests/LinearAlgebraTests/Double/ReturnTypeTests.cs new file mode 100644 index 00000000..482c4ce4 --- /dev/null +++ b/src/UnitTests/LinearAlgebraTests/Double/ReturnTypeTests.cs @@ -0,0 +1,220 @@ +using MathNet.Numerics.LinearAlgebra; +using MathNet.Numerics.LinearAlgebra.Double; +using NUnit.Framework; + +namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Double +{ + [TestFixture] + public class ReturnTypeTests + { + readonly Vector _vectorDense = Vector.Build.Dense(3); + readonly Vector _vectorSparse = Vector.Build.Sparse(3); + readonly Matrix _matrixDense = Matrix.Build.Dense(3, 3); + readonly Matrix _matrixSparse = Matrix.Build.Sparse(3, 3); + readonly Matrix _matrixDiagonal = Matrix.Build.Diagonal(3, 3); + + [Test] + public void VerifyExamples() + { + Assert.That(_vectorDense, Is.TypeOf()); + Assert.That(_vectorSparse, Is.TypeOf()); + Assert.That(_matrixDense, Is.TypeOf()); + Assert.That(_matrixSparse, Is.TypeOf()); + Assert.That(_matrixDiagonal, Is.TypeOf()); + } + + [Test] + public void Negate() + { + Assert.That(_vectorDense.Negate(), Is.InstanceOf()); + Assert.That(_vectorSparse.Negate(), Is.InstanceOf()); + Assert.That(_matrixDense.Negate(), Is.InstanceOf()); + Assert.That(_matrixSparse.Negate(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Negate(), Is.InstanceOf()); + } + + [Test] + public void Conjugate() + { + Assert.That(_vectorDense.Conjugate(), Is.InstanceOf()); + Assert.That(_vectorSparse.Conjugate(), Is.InstanceOf()); + Assert.That(_matrixDense.Conjugate(), Is.InstanceOf()); + Assert.That(_matrixSparse.Conjugate(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Conjugate(), Is.InstanceOf()); + } + + [Test] + public void Transpose() + { + Assert.That(_matrixDense.Transpose(), Is.InstanceOf()); + Assert.That(_matrixSparse.Transpose(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Transpose(), Is.InstanceOf()); + } + + [Test] + public void ConjugateTranspose() + { + Assert.That(_matrixDense.ConjugateTranspose(), Is.InstanceOf()); + Assert.That(_matrixSparse.ConjugateTranspose(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.ConjugateTranspose(), Is.InstanceOf()); + } + + [Test] + public void Add() + { + Assert.That(_vectorDense + _vectorDense, Is.InstanceOf()); + Assert.That(_vectorDense + _vectorSparse, Is.InstanceOf()); + Assert.That(_vectorSparse + _vectorDense, Is.InstanceOf()); + Assert.That(_vectorSparse + _vectorSparse, Is.InstanceOf()); + Assert.That(_matrixDense + _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDense + _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDense + _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixSparse + _matrixDense, Is.InstanceOf()); + Assert.That(_matrixSparse + _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixSparse + _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixDiagonal + _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal + _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal + _matrixDiagonal, Is.InstanceOf()); + } + + [Test] + public void Subtract() + { + Assert.That(_vectorDense - _vectorDense, Is.InstanceOf()); + Assert.That(_vectorDense - _vectorSparse, Is.InstanceOf()); + Assert.That(_vectorSparse - _vectorDense, Is.InstanceOf()); + Assert.That(_vectorSparse - _vectorSparse, Is.InstanceOf()); + Assert.That(_matrixDense - _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDense - _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDense - _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixSparse - _matrixDense, Is.InstanceOf()); + Assert.That(_matrixSparse - _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixSparse - _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixDiagonal - _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal - _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal - _matrixDiagonal, Is.InstanceOf()); + } + + [Test] + public void PointwiseMultiply() + { + Assert.That(_vectorDense.PointwiseMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_vectorDense.PointwiseMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_vectorSparse.PointwiseMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_vectorSparse.PointwiseMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_matrixDense.PointwiseMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.PointwiseMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.PointwiseMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.PointwiseMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.PointwiseMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.PointwiseMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.PointwiseMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.PointwiseMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.PointwiseMultiply(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void MatrixMultiply() + { + Assert.That(_matrixDense*_matrixDense, Is.InstanceOf()); + Assert.That(_matrixDense*_matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDense*_matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixSparse*_matrixDense, Is.InstanceOf()); + Assert.That(_matrixSparse*_matrixSparse, Is.InstanceOf()); + Assert.That(_matrixSparse*_matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_matrixDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_matrixDiagonal, Is.InstanceOf()); + + Assert.That(_matrixDense.TransposeThisAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeThisAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeThisAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_matrixDiagonal), Is.InstanceOf()); + + Assert.That(_matrixDense.TransposeAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeAndMultiply(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void MatrixVectorMultiply() + { + Assert.That(_matrixDense*_vectorDense, Is.InstanceOf()); + Assert.That(_matrixDense*_vectorSparse, Is.InstanceOf()); + Assert.That(_matrixSparse*_vectorDense, Is.InstanceOf()); + Assert.That(_matrixSparse*_vectorSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_vectorDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_vectorSparse, Is.InstanceOf()); + + Assert.That(_vectorDense*_matrixDense, Is.InstanceOf()); + Assert.That(_vectorSparse*_matrixDense, Is.InstanceOf()); + Assert.That(_vectorDense*_matrixSparse, Is.InstanceOf()); + Assert.That(_vectorSparse*_matrixSparse, Is.InstanceOf()); + Assert.That(_vectorDense*_matrixDiagonal, Is.InstanceOf()); + Assert.That(_vectorSparse*_matrixDiagonal, Is.InstanceOf()); + + Assert.That(_matrixDense.TransposeThisAndMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeThisAndMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_vectorSparse), Is.InstanceOf()); + } + + [Test] + public void Append() + { + Assert.That(_matrixDense.Append(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.Append(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.Append(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.Append(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.Append(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.Append(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Append(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Append(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Append(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void Stack() + { + Assert.That(_matrixDense.Stack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.Stack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.Stack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.Stack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.Stack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.Stack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Stack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Stack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Stack(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void DiagonalStack() + { + Assert.That(_matrixDense.DiagonalStack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.DiagonalStack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.DiagonalStack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.DiagonalStack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.DiagonalStack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.DiagonalStack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + + // Special Case + Assert.That(Matrix.Build.DiagonalIdentity(2, 4).DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + } + } +} diff --git a/src/UnitTests/LinearAlgebraTests/Single/ReturnTypeTests.cs b/src/UnitTests/LinearAlgebraTests/Single/ReturnTypeTests.cs new file mode 100644 index 00000000..e43c668a --- /dev/null +++ b/src/UnitTests/LinearAlgebraTests/Single/ReturnTypeTests.cs @@ -0,0 +1,220 @@ +using MathNet.Numerics.LinearAlgebra; +using MathNet.Numerics.LinearAlgebra.Single; +using NUnit.Framework; + +namespace MathNet.Numerics.UnitTests.LinearAlgebraTests.Single +{ + [TestFixture] + public class ReturnTypeTests + { + readonly Vector _vectorDense = Vector.Build.Dense(3); + readonly Vector _vectorSparse = Vector.Build.Sparse(3); + readonly Matrix _matrixDense = Matrix.Build.Dense(3, 3); + readonly Matrix _matrixSparse = Matrix.Build.Sparse(3, 3); + readonly Matrix _matrixDiagonal = Matrix.Build.Diagonal(3, 3); + + [Test] + public void VerifyExamples() + { + Assert.That(_vectorDense, Is.TypeOf()); + Assert.That(_vectorSparse, Is.TypeOf()); + Assert.That(_matrixDense, Is.TypeOf()); + Assert.That(_matrixSparse, Is.TypeOf()); + Assert.That(_matrixDiagonal, Is.TypeOf()); + } + + [Test] + public void Negate() + { + Assert.That(_vectorDense.Negate(), Is.InstanceOf()); + Assert.That(_vectorSparse.Negate(), Is.InstanceOf()); + Assert.That(_matrixDense.Negate(), Is.InstanceOf()); + Assert.That(_matrixSparse.Negate(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Negate(), Is.InstanceOf()); + } + + [Test] + public void Conjugate() + { + Assert.That(_vectorDense.Conjugate(), Is.InstanceOf()); + Assert.That(_vectorSparse.Conjugate(), Is.InstanceOf()); + Assert.That(_matrixDense.Conjugate(), Is.InstanceOf()); + Assert.That(_matrixSparse.Conjugate(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Conjugate(), Is.InstanceOf()); + } + + [Test] + public void Transpose() + { + Assert.That(_matrixDense.Transpose(), Is.InstanceOf()); + Assert.That(_matrixSparse.Transpose(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Transpose(), Is.InstanceOf()); + } + + [Test] + public void ConjugateTranspose() + { + Assert.That(_matrixDense.ConjugateTranspose(), Is.InstanceOf()); + Assert.That(_matrixSparse.ConjugateTranspose(), Is.InstanceOf()); + Assert.That(_matrixDiagonal.ConjugateTranspose(), Is.InstanceOf()); + } + + [Test] + public void Add() + { + Assert.That(_vectorDense + _vectorDense, Is.InstanceOf()); + Assert.That(_vectorDense + _vectorSparse, Is.InstanceOf()); + Assert.That(_vectorSparse + _vectorDense, Is.InstanceOf()); + Assert.That(_vectorSparse + _vectorSparse, Is.InstanceOf()); + Assert.That(_matrixDense + _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDense + _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDense + _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixSparse + _matrixDense, Is.InstanceOf()); + Assert.That(_matrixSparse + _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixSparse + _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixDiagonal + _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal + _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal + _matrixDiagonal, Is.InstanceOf()); + } + + [Test] + public void Subtract() + { + Assert.That(_vectorDense - _vectorDense, Is.InstanceOf()); + Assert.That(_vectorDense - _vectorSparse, Is.InstanceOf()); + Assert.That(_vectorSparse - _vectorDense, Is.InstanceOf()); + Assert.That(_vectorSparse - _vectorSparse, Is.InstanceOf()); + Assert.That(_matrixDense - _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDense - _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDense - _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixSparse - _matrixDense, Is.InstanceOf()); + Assert.That(_matrixSparse - _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixSparse - _matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixDiagonal - _matrixDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal - _matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal - _matrixDiagonal, Is.InstanceOf()); + } + + [Test] + public void PointwiseMultiply() + { + Assert.That(_vectorDense.PointwiseMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_vectorDense.PointwiseMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_vectorSparse.PointwiseMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_vectorSparse.PointwiseMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_matrixDense.PointwiseMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.PointwiseMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.PointwiseMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.PointwiseMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.PointwiseMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.PointwiseMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.PointwiseMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.PointwiseMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.PointwiseMultiply(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void MatrixMultiply() + { + Assert.That(_matrixDense*_matrixDense, Is.InstanceOf()); + Assert.That(_matrixDense*_matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDense*_matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixSparse*_matrixDense, Is.InstanceOf()); + Assert.That(_matrixSparse*_matrixSparse, Is.InstanceOf()); + Assert.That(_matrixSparse*_matrixDiagonal, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_matrixDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_matrixSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_matrixDiagonal, Is.InstanceOf()); + + Assert.That(_matrixDense.TransposeThisAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeThisAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeThisAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_matrixDiagonal), Is.InstanceOf()); + + Assert.That(_matrixDense.TransposeAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeAndMultiply(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeAndMultiply(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeAndMultiply(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeAndMultiply(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void MatrixVectorMultiply() + { + Assert.That(_matrixDense*_vectorDense, Is.InstanceOf()); + Assert.That(_matrixDense*_vectorSparse, Is.InstanceOf()); + Assert.That(_matrixSparse*_vectorDense, Is.InstanceOf()); + Assert.That(_matrixSparse*_vectorSparse, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_vectorDense, Is.InstanceOf()); + Assert.That(_matrixDiagonal*_vectorSparse, Is.InstanceOf()); + + Assert.That(_vectorDense*_matrixDense, Is.InstanceOf()); + Assert.That(_vectorSparse*_matrixDense, Is.InstanceOf()); + Assert.That(_vectorDense*_matrixSparse, Is.InstanceOf()); + Assert.That(_vectorSparse*_matrixSparse, Is.InstanceOf()); + Assert.That(_vectorDense*_matrixDiagonal, Is.InstanceOf()); + Assert.That(_vectorSparse*_matrixDiagonal, Is.InstanceOf()); + + Assert.That(_matrixDense.TransposeThisAndMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_matrixDense.TransposeThisAndMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_matrixSparse.TransposeThisAndMultiply(_vectorSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_vectorDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.TransposeThisAndMultiply(_vectorSparse), Is.InstanceOf()); + } + + [Test] + public void Append() + { + Assert.That(_matrixDense.Append(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.Append(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.Append(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.Append(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.Append(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.Append(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Append(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Append(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Append(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void Stack() + { + Assert.That(_matrixDense.Stack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.Stack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.Stack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.Stack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.Stack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.Stack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Stack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Stack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.Stack(_matrixDiagonal), Is.InstanceOf()); + } + + [Test] + public void DiagonalStack() + { + Assert.That(_matrixDense.DiagonalStack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDense.DiagonalStack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDense.DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixSparse.DiagonalStack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixSparse.DiagonalStack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixSparse.DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + Assert.That(_matrixDiagonal.DiagonalStack(_matrixDense), Is.InstanceOf()); + Assert.That(_matrixDiagonal.DiagonalStack(_matrixSparse), Is.InstanceOf()); + Assert.That(_matrixDiagonal.DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + + // Special Case + Assert.That(Matrix.Build.DiagonalIdentity(2, 4).DiagonalStack(_matrixDiagonal), Is.InstanceOf()); + } + } +} diff --git a/src/UnitTests/UnitTests.csproj b/src/UnitTests/UnitTests.csproj index e0868287..fd6ba3bd 100644 --- a/src/UnitTests/UnitTests.csproj +++ b/src/UnitTests/UnitTests.csproj @@ -174,6 +174,7 @@ + @@ -222,6 +223,7 @@ + @@ -250,6 +252,7 @@ + @@ -320,6 +323,7 @@ +