From c2f4415dc2d91cf992d40b37e5eebca455f130e9 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Sun, 15 Jun 2014 23:35:51 +0200 Subject: [PATCH] LA: Matrix Column/Row sums and absolute-sums --- src/Numerics/LinearAlgebra/Complex/Matrix.cs | 40 +++++++++++++++++++ .../LinearAlgebra/Complex32/Matrix.cs | 40 +++++++++++++++++++ src/Numerics/LinearAlgebra/Double/Matrix.cs | 40 +++++++++++++++++++ .../LinearAlgebra/Matrix.Arithmetic.cs | 20 ++++++++++ src/Numerics/LinearAlgebra/Single/Matrix.cs | 39 ++++++++++++++++++ 5 files changed, 179 insertions(+) diff --git a/src/Numerics/LinearAlgebra/Complex/Matrix.cs b/src/Numerics/LinearAlgebra/Complex/Matrix.cs index 9be6cdbc..fe7de0c2 100644 --- a/src/Numerics/LinearAlgebra/Complex/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/Matrix.cs @@ -204,6 +204,46 @@ namespace MathNet.Numerics.LinearAlgebra.Complex return result; } + /// + /// Calculates the value sum of each row vector. + /// + public override Vector RowSums() + { + var ret = new Complex[RowCount]; + Storage.FoldByRowUnchecked(ret, (s, x) => s + x, (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + + /// + /// Calculates the absolute value sum of each row vector. + /// + public override Vector RowAbsoluteSums() + { + var ret = new Complex[RowCount]; + Storage.FoldByRowUnchecked(ret, (s, x) => s + x.Magnitude, (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + + /// + /// Calculates the value sum of each column vector. + /// + public override Vector ColumnSums() + { + var ret = new Complex[ColumnCount]; + Storage.FoldByColumnUnchecked(ret, (s, x) => s + x, (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + + /// + /// Calculates the absolute value sum of each column vector. + /// + public override Vector ColumnAbsoluteSums() + { + var ret = new Complex[ColumnCount]; + Storage.FoldByColumnUnchecked(ret, (s, x) => s + x.Magnitude, (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + /// /// Returns the conjugate transpose of this matrix. /// diff --git a/src/Numerics/LinearAlgebra/Complex32/Matrix.cs b/src/Numerics/LinearAlgebra/Complex32/Matrix.cs index 764b14a5..cf988d1b 100644 --- a/src/Numerics/LinearAlgebra/Complex32/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/Matrix.cs @@ -198,6 +198,46 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 return result; } + /// + /// Calculates the value sum of each row vector. + /// + public override Vector RowSums() + { + var ret = new Complex32[RowCount]; + Storage.FoldByRowUnchecked(ret, (s, x) => s + x, (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + + /// + /// Calculates the absolute value sum of each row vector. + /// + public override Vector RowAbsoluteSums() + { + var ret = new Complex32[RowCount]; + Storage.FoldByRowUnchecked(ret, (s, x) => s + x.Magnitude, (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + + /// + /// Calculates the value sum of each column vector. + /// + public override Vector ColumnSums() + { + var ret = new Complex32[ColumnCount]; + Storage.FoldByColumnUnchecked(ret, (s, x) => s + x, (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + + /// + /// Calculates the absolute value sum of each column vector. + /// + public override Vector ColumnAbsoluteSums() + { + var ret = new Complex32[ColumnCount]; + Storage.FoldByColumnUnchecked(ret, (s, x) => s + x.Magnitude, (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + /// /// Returns the conjugate transpose of this matrix. /// diff --git a/src/Numerics/LinearAlgebra/Double/Matrix.cs b/src/Numerics/LinearAlgebra/Double/Matrix.cs index 07086314..32766df8 100644 --- a/src/Numerics/LinearAlgebra/Double/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Double/Matrix.cs @@ -196,6 +196,46 @@ namespace MathNet.Numerics.LinearAlgebra.Double return result; } + /// + /// Calculates the value sum of each row vector. + /// + public override Vector RowSums() + { + var ret = new double[RowCount]; + Storage.FoldByRowUnchecked(ret, (s, x) => s + x, (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + + /// + /// Calculates the absolute value sum of each row vector. + /// + public override Vector RowAbsoluteSums() + { + var ret = new double[RowCount]; + Storage.FoldByRowUnchecked(ret, (s, x) => s + Math.Abs(x), (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + + /// + /// Calculates the value sum of each column vector. + /// + public override Vector ColumnSums() + { + var ret = new double[ColumnCount]; + Storage.FoldByColumnUnchecked(ret, (s, x) => s + x, (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + + /// + /// Calculates the absolute value sum of each column vector. + /// + public override Vector ColumnAbsoluteSums() + { + var ret = new double[ColumnCount]; + Storage.FoldByColumnUnchecked(ret, (s, x) => s + Math.Abs(x), (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + /// /// Returns the conjugate transpose of this matrix. /// diff --git a/src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs b/src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs index 829341ba..999b3921 100644 --- a/src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs +++ b/src/Numerics/LinearAlgebra/Matrix.Arithmetic.cs @@ -1674,6 +1674,26 @@ namespace MathNet.Numerics.LinearAlgebra /// public abstract Matrix NormalizeColumns(double norm); + /// + /// Calculates the value sum of each row vector. + /// + public abstract Vector RowSums(); + + /// + /// Calculates the value sum of each column vector. + /// + public abstract Vector ColumnSums(); + + /// + /// Calculates the absolute value sum of each row vector. + /// + public abstract Vector RowAbsoluteSums(); + + /// + /// Calculates the absolute value sum of each column vector. + /// + public abstract Vector ColumnAbsoluteSums(); + #region Exceptions - possibly move elsewhere? internal static Exception DimensionsDontMatch(Matrix left, Matrix right, Matrix result, string paramName = null) diff --git a/src/Numerics/LinearAlgebra/Single/Matrix.cs b/src/Numerics/LinearAlgebra/Single/Matrix.cs index 098111e1..c5898764 100644 --- a/src/Numerics/LinearAlgebra/Single/Matrix.cs +++ b/src/Numerics/LinearAlgebra/Single/Matrix.cs @@ -195,6 +195,45 @@ namespace MathNet.Numerics.LinearAlgebra.Single Storage.MapIndexedTo(result.Storage, (i, j, x) => (float)norminv[j]*x, Zeros.AllowSkip, ExistingData.AssumeZeros); return result; } + /// + /// Calculates the value sum of each row vector. + /// + public override Vector RowSums() + { + var ret = new float[RowCount]; + Storage.FoldByRowUnchecked(ret, (s, x) => s + x, (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + + /// + /// Calculates the absolute value sum of each row vector. + /// + public override Vector RowAbsoluteSums() + { + var ret = new float[RowCount]; + Storage.FoldByRowUnchecked(ret, (s, x) => s + Math.Abs(x), (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + + /// + /// Calculates the value sum of each column vector. + /// + public override Vector ColumnSums() + { + var ret = new float[ColumnCount]; + Storage.FoldByColumnUnchecked(ret, (s, x) => s + x, (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } + + /// + /// Calculates the absolute value sum of each column vector. + /// + public override Vector ColumnAbsoluteSums() + { + var ret = new float[ColumnCount]; + Storage.FoldByColumnUnchecked(ret, (s, x) => s + Math.Abs(x), (x, c) => x, ret, Zeros.AllowSkip); + return Vector.Build.Dense(ret); + } /// /// Returns the conjugate transpose of this matrix.