Browse Source

Managed Provider: cache-optimized matrix L-infinity norm (8-10 times faster)

optimization-1
Christoph Ruegg 13 years ago
parent
commit
85db0a6884
  1. 25
      src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Complex.cs
  2. 25
      src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Complex32.cs
  3. 33
      src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Double.cs
  4. 25
      src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Single.cs

25
src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Complex.cs

@ -431,26 +431,33 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
return norm1; return norm1;
case Norm.LargestAbsoluteValue: case Norm.LargestAbsoluteValue:
var normMax = 0d; var normMax = 0d;
for (var i = 0; i < rows; i++) for (var j = 0; j < columns; j++)
{ {
for (var j = 0; j < columns; j++) for (var i = 0; i < rows; i++)
{ {
normMax = Math.Max(matrix[(j * rows) + i].Magnitude, normMax); normMax = Math.Max(matrix[(j * rows) + i].Magnitude, normMax);
} }
} }
return normMax; return normMax;
case Norm.InfinityNorm: case Norm.InfinityNorm:
var normInf = 0d; var r = new double[rows];
for (var i = 0; i < rows; i++) for (var j = 0; j < columns; j++)
{ {
var s = 0.0; for (var i = 0; i < rows; i++)
for (var j = 0; j < columns; j++)
{ {
s += matrix[(j*rows) + i].Magnitude; r[i] += matrix[(j * rows) + i].Magnitude;
}
}
// TODO: reuse
var max = r[0];
for (int i = 0; i < r.Length; i++)
{
if (r[i] > max)
{
max = r[i];
} }
normInf = Math.Max(normInf, s);
} }
return normInf; return max;
case Norm.FrobeniusNorm: case Norm.FrobeniusNorm:
var aat = new Complex[rows*rows]; var aat = new Complex[rows*rows];
MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.ConjugateTranspose, 1.0, matrix, rows, columns, matrix, rows, columns, 0.0, aat); MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.ConjugateTranspose, 1.0, matrix, rows, columns, matrix, rows, columns, 0.0, aat);

25
src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Complex32.cs

@ -428,26 +428,33 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
return norm1; return norm1;
case Norm.LargestAbsoluteValue: case Norm.LargestAbsoluteValue:
var normMax = 0d; var normMax = 0d;
for (var i = 0; i < rows; i++) for (var j = 0; j < columns; j++)
{ {
for (var j = 0; j < columns; j++) for (var i = 0; i < rows; i++)
{ {
normMax = Math.Max(matrix[(j * rows) + i].Magnitude, normMax); normMax = Math.Max(matrix[(j * rows) + i].Magnitude, normMax);
} }
} }
return normMax; return normMax;
case Norm.InfinityNorm: case Norm.InfinityNorm:
var normInf = 0d; var r = new double[rows];
for (var i = 0; i < rows; i++) for (var j = 0; j < columns; j++)
{ {
var s = 0d; for (var i = 0; i < rows; i++)
for (var j = 0; j < columns; j++)
{ {
s += matrix[(j*rows) + i].Magnitude; r[i] += matrix[(j * rows) + i].Magnitude;
}
}
// TODO: reuse
var max = r[0];
for (int i = 0; i < r.Length; i++)
{
if (r[i] > max)
{
max = r[i];
} }
normInf = Math.Max(normInf, s);
} }
return normInf; return max;
case Norm.FrobeniusNorm: case Norm.FrobeniusNorm:
var aat = new Complex32[rows*rows]; var aat = new Complex32[rows*rows];
MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.ConjugateTranspose, 1.0f, matrix, rows, columns, matrix, rows, columns, 0.0f, aat); MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.ConjugateTranspose, 1.0f, matrix, rows, columns, matrix, rows, columns, 0.0f, aat);

33
src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Double.cs

@ -426,26 +426,33 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
return norm1; return norm1;
case Norm.LargestAbsoluteValue: case Norm.LargestAbsoluteValue:
var normMax = 0d; var normMax = 0d;
for (var i = 0; i < rows; i++) for (var j = 0; j < columns; j++)
{ {
for (var j = 0; j < columns; j++) for (var i = 0; i < rows; i++)
{ {
normMax = Math.Max(Math.Abs(matrix[(j * rows) + i]), normMax); normMax = Math.Max(Math.Abs(matrix[(j * rows) + i]), normMax);
} }
} }
return normMax; return normMax;
case Norm.InfinityNorm: case Norm.InfinityNorm:
var normInf = 0d; var r = new double[rows];
for (var i = 0; i < rows; i++) for (var j = 0; j < columns; j++)
{ {
var s = 0.0; for (var i = 0; i < rows; i++)
for (var j = 0; j < columns; j++) {
{ r[i] += Math.Abs(matrix[(j * rows) + i]);
s += Math.Abs(matrix[(j*rows) + i]); }
} }
normInf = Math.Max(normInf, s); // TODO: reuse
} var max = r[0];
return normInf; for (int i = 0; i < r.Length; i++)
{
if (r[i] > max)
{
max = r[i];
}
}
return max;
case Norm.FrobeniusNorm: case Norm.FrobeniusNorm:
var aat = new double[rows*rows]; var aat = new double[rows*rows];
MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.Transpose, 1.0, matrix, rows, columns, matrix, rows, columns, 0.0, aat); MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.Transpose, 1.0, matrix, rows, columns, matrix, rows, columns, 0.0, aat);

25
src/Numerics/Providers/LinearAlgebra/ManagedLinearAlgebraProvider.Single.cs

@ -426,26 +426,33 @@ namespace MathNet.Numerics.Providers.LinearAlgebra
return norm1; return norm1;
case Norm.LargestAbsoluteValue: case Norm.LargestAbsoluteValue:
var normMax = 0d; var normMax = 0d;
for (var i = 0; i < rows; i++) for (var j = 0; j < columns; j++)
{ {
for (var j = 0; j < columns; j++) for (var i = 0; i < rows; i++)
{ {
normMax = Math.Max(Math.Abs(matrix[(j * rows) + i]), normMax); normMax = Math.Max(Math.Abs(matrix[(j * rows) + i]), normMax);
} }
} }
return normMax; return normMax;
case Norm.InfinityNorm: case Norm.InfinityNorm:
var normInf = 0d; var r = new double[rows];
for (var i = 0; i < rows; i++) for (var j = 0; j < columns; j++)
{ {
var s = 0d; for (var i = 0; i < rows; i++)
for (var j = 0; j < columns; j++)
{ {
s += Math.Abs(matrix[(j*rows) + i]); r[i] += Math.Abs(matrix[(j * rows) + i]);
}
}
// TODO: reuse
var max = r[0];
for (int i = 0; i < r.Length; i++)
{
if (r[i] > max)
{
max = r[i];
} }
normInf = Math.Max(normInf, s);
} }
return normInf; return max;
case Norm.FrobeniusNorm: case Norm.FrobeniusNorm:
var aat = new float[rows*rows]; var aat = new float[rows*rows];
MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.Transpose, 1.0f, matrix, rows, columns, matrix, rows, columns, 0.0f, aat); MatrixMultiplyWithUpdate(Transpose.DontTranspose, Transpose.Transpose, 1.0f, matrix, rows, columns, matrix, rows, columns, 0.0f, aat);

Loading…
Cancel
Save