From 3535483489f83393d1bc9fc1610caabe6fa6ce87 Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Sun, 7 Apr 2013 19:31:06 +0200 Subject: [PATCH] LA: diagonal matrix OfArray --- .../LinearAlgebra/Complex/DiagonalMatrix.cs | 17 +--------------- .../LinearAlgebra/Complex32/DiagonalMatrix.cs | 17 +--------------- .../LinearAlgebra/Double/DiagonalMatrix.cs | 17 +--------------- .../LinearAlgebra/Single/DiagonalMatrix.cs | 17 +--------------- .../Storage/DiagonalMatrixStorage.cs | 20 +++++++++++++++++++ 5 files changed, 24 insertions(+), 64 deletions(-) diff --git a/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs index 73414fc5..3a04bd4e 100644 --- a/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex/DiagonalMatrix.cs @@ -138,22 +138,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex /// public static DiagonalMatrix OfArray(Complex[,] array) { - var storage = new DiagonalMatrixStorage(array.GetLength(0), array.GetLength(1)); - for (var i = 0; i < storage.RowCount; i++) - { - for (var j = 0; j < storage.ColumnCount; j++) - { - if (i == j) - { - storage.Data[i] = array[i, j]; - } - else if (((array[i, j].Real != 0d) && !double.IsNaN(array[i, j].Real)) || ((array[i, j].Imaginary != 0d) && !double.IsNaN(array[i, j].Imaginary))) - { - throw new IndexOutOfRangeException("Cannot set an off-diagonal element in a diagonal matrix."); - } - } - } - return new DiagonalMatrix(storage); + return new DiagonalMatrix(DiagonalMatrixStorage.OfArray(array)); } /// diff --git a/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs index ea64ec82..ee1a4d36 100644 --- a/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Complex32/DiagonalMatrix.cs @@ -138,22 +138,7 @@ namespace MathNet.Numerics.LinearAlgebra.Complex32 /// public static DiagonalMatrix OfArray(Complex32[,] array) { - var storage = new DiagonalMatrixStorage(array.GetLength(0), array.GetLength(1)); - for (var i = 0; i < storage.RowCount; i++) - { - for (var j = 0; j < storage.ColumnCount; j++) - { - if (i == j) - { - storage.Data[i] = array[i, j]; - } - else if (((array[i, j].Real != 0f) && !float.IsNaN(array[i, j].Real)) || ((array[i, j].Imaginary != 0f) && !float.IsNaN(array[i, j].Imaginary))) - { - throw new IndexOutOfRangeException("Cannot set an off-diagonal element in a diagonal matrix."); - } - } - } - return new DiagonalMatrix(storage); + return new DiagonalMatrix(DiagonalMatrixStorage.OfArray(array)); } /// diff --git a/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs index 26ab2bce..932e4eff 100644 --- a/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Double/DiagonalMatrix.cs @@ -137,22 +137,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double /// public static DiagonalMatrix OfArray(double[,] array) { - var storage = new DiagonalMatrixStorage(array.GetLength(0), array.GetLength(1)); - for (var i = 0; i < storage.RowCount; i++) - { - for (var j = 0; j < storage.ColumnCount; j++) - { - if (i == j) - { - storage.Data[i] = array[i, j]; - } - else if (array[i, j] != 0d && !double.IsNaN(array[i, j])) - { - throw new IndexOutOfRangeException("Cannot set an off-diagonal element in a diagonal matrix."); - } - } - } - return new DiagonalMatrix(storage); + return new DiagonalMatrix(DiagonalMatrixStorage.OfArray(array)); } /// diff --git a/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs b/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs index e0c7f887..cd03fee8 100644 --- a/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs +++ b/src/Numerics/LinearAlgebra/Single/DiagonalMatrix.cs @@ -137,22 +137,7 @@ namespace MathNet.Numerics.LinearAlgebra.Single /// public static DiagonalMatrix OfArray(float[,] array) { - var storage = new DiagonalMatrixStorage(array.GetLength(0), array.GetLength(1)); - for (var i = 0; i < storage.RowCount; i++) - { - for (var j = 0; j < storage.ColumnCount; j++) - { - if (i == j) - { - storage.Data[i] = array[i, j]; - } - else if (array[i, j] != 0f && !float.IsNaN(array[i, j])) - { - throw new IndexOutOfRangeException("Cannot set an off-diagonal element in a diagonal matrix."); - } - } - } - return new DiagonalMatrix(storage); + return new DiagonalMatrix(DiagonalMatrixStorage.OfArray(array)); } /// diff --git a/src/Numerics/LinearAlgebra/Storage/DiagonalMatrixStorage.cs b/src/Numerics/LinearAlgebra/Storage/DiagonalMatrixStorage.cs index a2a97995..4980fc15 100644 --- a/src/Numerics/LinearAlgebra/Storage/DiagonalMatrixStorage.cs +++ b/src/Numerics/LinearAlgebra/Storage/DiagonalMatrixStorage.cs @@ -179,6 +179,26 @@ namespace MathNet.Numerics.LinearAlgebra.Storage return storage; } + public static DiagonalMatrixStorage OfArray(T[,] array) + { + var storage = new DiagonalMatrixStorage(array.GetLength(0), array.GetLength(1)); + for (var i = 0; i < storage.RowCount; i++) + { + for (var j = 0; j < storage.ColumnCount; j++) + { + if (i == j) + { + storage.Data[i] = array[i, j]; + } + else if (!Zero.Equals(array[i, j])) + { + throw new IndexOutOfRangeException("Cannot set an off-diagonal element in a diagonal matrix."); + } + } + } + return storage; + } + // MATRIX COPY internal override void CopyToUnchecked(MatrixStorage target, bool skipClearing = false)