From 5931509187a0afeb000490743cef5b95787b5bca Mon Sep 17 00:00:00 2001 From: Christoph Ruegg Date: Sun, 15 Jan 2017 10:28:18 +0100 Subject: [PATCH] Fourier2D: leverage new matrix internal array access approach --- src/Numerics/IntegralTransforms/Fourier.cs | 44 ++++++++++++++-------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/Numerics/IntegralTransforms/Fourier.cs b/src/Numerics/IntegralTransforms/Fourier.cs index 2364f9ba..dcf8710f 100644 --- a/src/Numerics/IntegralTransforms/Fourier.cs +++ b/src/Numerics/IntegralTransforms/Fourier.cs @@ -194,19 +194,25 @@ namespace MathNet.Numerics.IntegralTransforms /// Fourier Transform Convention Options. public static void Forward2D(Matrix samples, FourierOptions options = FourierOptions.Default) { - // since dense matrix data is column major, we switch rows and columns + var rowMajorArray = samples.AsRowMajorArray(); + if (rowMajorArray != null) + { + ForwardMultiDim(rowMajorArray, new[] { samples.RowCount, samples.ColumnCount }, options); + return; + } - var denseStorage = samples.Storage as DenseColumnMajorMatrixStorage; - if (denseStorage == null) + var columnMajorArray = samples.AsColumnMajorArray(); + if (columnMajorArray != null) { - var samplesColumnMajor = samples.ToColumnWiseArray(); - ForwardMultiDim(samplesColumnMajor, new[] { samples.ColumnCount, samples.RowCount }, options); - denseStorage = new DenseColumnMajorMatrixStorage(samples.RowCount, samples.ColumnCount, samplesColumnMajor); - denseStorage.CopyToUnchecked(samples.Storage, ExistingData.Clear); + ForwardMultiDim(columnMajorArray, new[] { samples.ColumnCount, samples.RowCount }, options); return; } - ForwardMultiDim(denseStorage.Data, new[] { samples.ColumnCount, samples.RowCount }, options); + // Fall Back + columnMajorArray = samples.ToColumnMajorArray(); + ForwardMultiDim(columnMajorArray, new[] { samples.ColumnCount, samples.RowCount }, options); + var denseStorage = new DenseColumnMajorMatrixStorage(samples.RowCount, samples.ColumnCount, columnMajorArray); + denseStorage.CopyToUnchecked(samples.Storage, ExistingData.Clear); } /// @@ -369,19 +375,25 @@ namespace MathNet.Numerics.IntegralTransforms /// Fourier Transform Convention Options. public static void Inverse2D(Matrix spectrum, FourierOptions options = FourierOptions.Default) { - // since dense matrix data is column major, we switch rows and columns + var rowMajorArray = spectrum.AsRowMajorArray(); + if (rowMajorArray != null) + { + InverseMultiDim(rowMajorArray, new[] { spectrum.RowCount, spectrum.ColumnCount }, options); + return; + } - var denseStorage = spectrum.Storage as DenseColumnMajorMatrixStorage; - if (denseStorage == null) + var columnMajorArray = spectrum.AsColumnMajorArray(); + if (columnMajorArray != null) { - var samplesColumnMajor = spectrum.ToColumnWiseArray(); - InverseMultiDim(samplesColumnMajor, new[] { spectrum.ColumnCount, spectrum.RowCount }, options); - denseStorage = new DenseColumnMajorMatrixStorage(spectrum.RowCount, spectrum.ColumnCount, samplesColumnMajor); - denseStorage.CopyToUnchecked(spectrum.Storage, ExistingData.Clear); + InverseMultiDim(columnMajorArray, new[] { spectrum.ColumnCount, spectrum.RowCount }, options); return; } - InverseMultiDim(denseStorage.Data, new[] { spectrum.ColumnCount, spectrum.RowCount }, options); + // Fall Back + columnMajorArray = spectrum.ToColumnMajorArray(); + InverseMultiDim(columnMajorArray, new[] { spectrum.ColumnCount, spectrum.RowCount }, options); + var denseStorage = new DenseColumnMajorMatrixStorage(spectrum.RowCount, spectrum.ColumnCount, columnMajorArray); + denseStorage.CopyToUnchecked(spectrum.Storage, ExistingData.Clear); } ///