|
|
|
@ -438,21 +438,21 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
/// <param name="result">The matrix to store the result of the addition.</param>
|
|
|
|
protected override void DoAdd(double scalar, Matrix<double> result) |
|
|
|
{ |
|
|
|
var denseResult = result as DenseMatrix; |
|
|
|
if (denseResult == null) |
|
|
|
if (result is DenseMatrix denseResult) |
|
|
|
{ |
|
|
|
base.DoAdd(scalar, result); |
|
|
|
return; |
|
|
|
CommonParallel.For(0, _values.Length, 4096, (a, b) => |
|
|
|
{ |
|
|
|
var v = denseResult._values; |
|
|
|
for (int i = a; i < b; i++) |
|
|
|
{ |
|
|
|
v[i] = _values[i] + scalar; |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
CommonParallel.For(0, _values.Length, 4096, (a, b) => |
|
|
|
else |
|
|
|
{ |
|
|
|
var v = denseResult._values; |
|
|
|
for (int i = a; i < b; i++) |
|
|
|
{ |
|
|
|
v[i] = _values[i] + scalar; |
|
|
|
} |
|
|
|
}); |
|
|
|
base.DoAdd(scalar, result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -493,21 +493,21 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
/// <param name="result">The matrix to store the result of the subtraction.</param>
|
|
|
|
protected override void DoSubtract(double scalar, Matrix<double> result) |
|
|
|
{ |
|
|
|
var denseResult = result as DenseMatrix; |
|
|
|
if (denseResult == null) |
|
|
|
if (result is DenseMatrix denseResult) |
|
|
|
{ |
|
|
|
base.DoSubtract(scalar, result); |
|
|
|
return; |
|
|
|
CommonParallel.For(0, _values.Length, 4096, (a, b) => |
|
|
|
{ |
|
|
|
var v = denseResult._values; |
|
|
|
for (int i = a; i < b; i++) |
|
|
|
{ |
|
|
|
v[i] = _values[i] - scalar; |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
CommonParallel.For(0, _values.Length, 4096, (a, b) => |
|
|
|
else |
|
|
|
{ |
|
|
|
var v = denseResult._values; |
|
|
|
for (int i = a; i < b; i++) |
|
|
|
{ |
|
|
|
v[i] = _values[i] - scalar; |
|
|
|
} |
|
|
|
}); |
|
|
|
base.DoSubtract(scalar, result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -546,14 +546,13 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
/// <param name="result">The matrix to store the result of the multiplication.</param>
|
|
|
|
protected override void DoMultiply(double scalar, Matrix<double> result) |
|
|
|
{ |
|
|
|
var denseResult = result as DenseMatrix; |
|
|
|
if (denseResult == null) |
|
|
|
if (result is DenseMatrix denseResult) |
|
|
|
{ |
|
|
|
base.DoMultiply(scalar, result); |
|
|
|
LinearAlgebraControl.Provider.ScaleArray(scalar, _values, denseResult._values); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
LinearAlgebraControl.Provider.ScaleArray(scalar, _values, denseResult._values); |
|
|
|
base.DoMultiply(scalar, result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -564,14 +563,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
/// <param name="result">The result of the multiplication.</param>
|
|
|
|
protected override void DoMultiply(Vector<double> rightSide, Vector<double> result) |
|
|
|
{ |
|
|
|
var denseRight = rightSide as DenseVector; |
|
|
|
var denseResult = result as DenseVector; |
|
|
|
|
|
|
|
if (denseRight == null || denseResult == null) |
|
|
|
{ |
|
|
|
base.DoMultiply(rightSide, result); |
|
|
|
} |
|
|
|
else |
|
|
|
if (rightSide is DenseVector denseRight && result is DenseVector denseResult) |
|
|
|
{ |
|
|
|
LinearAlgebraControl.Provider.MatrixMultiply( |
|
|
|
_values, |
|
|
|
@ -582,6 +574,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
1, |
|
|
|
denseResult.Values); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
base.DoMultiply(rightSide, result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -681,14 +677,7 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
/// <param name="result">The result of the multiplication.</param>
|
|
|
|
protected override void DoTransposeThisAndMultiply(Vector<double> rightSide, Vector<double> result) |
|
|
|
{ |
|
|
|
var denseRight = rightSide as DenseVector; |
|
|
|
var denseResult = result as DenseVector; |
|
|
|
|
|
|
|
if (denseRight == null || denseResult == null) |
|
|
|
{ |
|
|
|
base.DoTransposeThisAndMultiply(rightSide, result); |
|
|
|
} |
|
|
|
else |
|
|
|
if (rightSide is DenseVector denseRight && result is DenseVector denseResult) |
|
|
|
{ |
|
|
|
LinearAlgebraControl.Provider.MatrixMultiplyWithUpdate( |
|
|
|
Providers.LinearAlgebra.Transpose.Transpose, |
|
|
|
@ -703,6 +692,10 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
0.0, |
|
|
|
denseResult.Values); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
base.DoTransposeThisAndMultiply(rightSide, result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -760,14 +753,13 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
/// <param name="result">The matrix to store the result of the division.</param>
|
|
|
|
protected override void DoDivide(double divisor, Matrix<double> result) |
|
|
|
{ |
|
|
|
var denseResult = result as DenseMatrix; |
|
|
|
if (denseResult == null) |
|
|
|
if (result is DenseMatrix denseResult) |
|
|
|
{ |
|
|
|
base.DoDivide(divisor, result); |
|
|
|
LinearAlgebraControl.Provider.ScaleArray(1.0 / divisor, _values, denseResult._values); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
LinearAlgebraControl.Provider.ScaleArray(1.0/divisor, _values, denseResult._values); |
|
|
|
base.DoDivide(divisor, result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -778,16 +770,13 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
/// <param name="result">The matrix to store the result of the pointwise multiplication.</param>
|
|
|
|
protected override void DoPointwiseMultiply(Matrix<double> other, Matrix<double> result) |
|
|
|
{ |
|
|
|
var denseOther = other as DenseMatrix; |
|
|
|
var denseResult = result as DenseMatrix; |
|
|
|
|
|
|
|
if (denseOther == null || denseResult == null) |
|
|
|
if (other is DenseMatrix denseOther && result is DenseMatrix denseResult) |
|
|
|
{ |
|
|
|
base.DoPointwiseMultiply(other, result); |
|
|
|
LinearAlgebraControl.Provider.PointWiseMultiplyArrays(_values, denseOther._values, denseResult._values); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
LinearAlgebraControl.Provider.PointWiseMultiplyArrays(_values, denseOther._values, denseResult._values); |
|
|
|
base.DoPointwiseMultiply(other, result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -798,16 +787,13 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
/// <param name="result">The matrix to store the result of the pointwise division.</param>
|
|
|
|
protected override void DoPointwiseDivide(Matrix<double> divisor, Matrix<double> result) |
|
|
|
{ |
|
|
|
var denseDivisor = divisor as DenseMatrix; |
|
|
|
var denseResult = result as DenseMatrix; |
|
|
|
|
|
|
|
if (denseDivisor == null || denseResult == null) |
|
|
|
if (divisor is DenseMatrix denseDivisor && result is DenseMatrix denseResult) |
|
|
|
{ |
|
|
|
base.DoPointwiseDivide(divisor, result); |
|
|
|
LinearAlgebraControl.Provider.PointWiseDivideArrays(_values, denseDivisor._values, denseResult._values); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
LinearAlgebraControl.Provider.PointWiseDivideArrays(_values, denseDivisor._values, denseResult._values); |
|
|
|
base.DoPointwiseDivide(divisor, result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -818,16 +804,13 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
/// <param name="result">The vector to store the result of the pointwise power.</param>
|
|
|
|
protected override void DoPointwisePower(Matrix<double> exponent, Matrix<double> result) |
|
|
|
{ |
|
|
|
var denseExponent = exponent as DenseMatrix; |
|
|
|
var denseResult = result as DenseMatrix; |
|
|
|
|
|
|
|
if (denseExponent == null || denseResult == null) |
|
|
|
if (exponent is DenseMatrix denseExponent && result is DenseMatrix denseResult) |
|
|
|
{ |
|
|
|
base.DoPointwisePower(exponent, result); |
|
|
|
LinearAlgebraControl.Provider.PointWisePowerArrays(_values, denseExponent._values, denseResult._values); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
LinearAlgebraControl.Provider.PointWisePowerArrays(_values, denseExponent._values, denseResult._values); |
|
|
|
base.DoPointwisePower(exponent, result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -839,26 +822,26 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
/// <param name="result">Matrix to store the results in.</param>
|
|
|
|
protected override void DoModulus(double divisor, Matrix<double> result) |
|
|
|
{ |
|
|
|
var denseResult = result as DenseMatrix; |
|
|
|
if (denseResult == null) |
|
|
|
if (result is DenseMatrix denseResult) |
|
|
|
{ |
|
|
|
base.DoModulus(divisor, result); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (!ReferenceEquals(this, result)) |
|
|
|
{ |
|
|
|
CopyTo(result); |
|
|
|
} |
|
|
|
|
|
|
|
if (!ReferenceEquals(this, result)) |
|
|
|
{ |
|
|
|
CopyTo(result); |
|
|
|
CommonParallel.For(0, _values.Length, (a, b) => |
|
|
|
{ |
|
|
|
var v = denseResult._values; |
|
|
|
for (int i = a; i < b; i++) |
|
|
|
{ |
|
|
|
v[i] = Euclid.Modulus(v[i], divisor); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
CommonParallel.For(0, _values.Length, (a, b) => |
|
|
|
else |
|
|
|
{ |
|
|
|
var v = denseResult._values; |
|
|
|
for (int i = a; i < b; i++) |
|
|
|
{ |
|
|
|
v[i] = Euclid.Modulus(v[i], divisor); |
|
|
|
} |
|
|
|
}); |
|
|
|
base.DoModulus(divisor, result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -869,21 +852,21 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
/// <param name="result">A vector to store the results in.</param>
|
|
|
|
protected override void DoModulusByThis(double dividend, Matrix<double> result) |
|
|
|
{ |
|
|
|
var denseResult = result as DenseMatrix; |
|
|
|
if (denseResult == null) |
|
|
|
if (result is DenseMatrix denseResult) |
|
|
|
{ |
|
|
|
base.DoModulusByThis(dividend, result); |
|
|
|
return; |
|
|
|
CommonParallel.For(0, _values.Length, 4096, (a, b) => |
|
|
|
{ |
|
|
|
var v = denseResult._values; |
|
|
|
for (int i = a; i < b; i++) |
|
|
|
{ |
|
|
|
v[i] = Euclid.Modulus(dividend, _values[i]); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
CommonParallel.For(0, _values.Length, 4096, (a, b) => |
|
|
|
else |
|
|
|
{ |
|
|
|
var v = denseResult._values; |
|
|
|
for (int i = a; i < b; i++) |
|
|
|
{ |
|
|
|
v[i] = Euclid.Modulus(dividend, _values[i]); |
|
|
|
} |
|
|
|
}); |
|
|
|
base.DoModulusByThis(dividend, result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -894,26 +877,26 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
/// <param name="result">Matrix to store the results in.</param>
|
|
|
|
protected override void DoRemainder(double divisor, Matrix<double> result) |
|
|
|
{ |
|
|
|
var denseResult = result as DenseMatrix; |
|
|
|
if (denseResult == null) |
|
|
|
if (result is DenseMatrix denseResult) |
|
|
|
{ |
|
|
|
base.DoRemainder(divisor, result); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (!ReferenceEquals(this, result)) |
|
|
|
{ |
|
|
|
CopyTo(result); |
|
|
|
} |
|
|
|
|
|
|
|
if (!ReferenceEquals(this, result)) |
|
|
|
{ |
|
|
|
CopyTo(result); |
|
|
|
CommonParallel.For(0, _values.Length, (a, b) => |
|
|
|
{ |
|
|
|
var v = denseResult._values; |
|
|
|
for (int i = a; i < b; i++) |
|
|
|
{ |
|
|
|
v[i] %= divisor; |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
CommonParallel.For(0, _values.Length, (a, b) => |
|
|
|
else |
|
|
|
{ |
|
|
|
var v = denseResult._values; |
|
|
|
for (int i = a; i < b; i++) |
|
|
|
{ |
|
|
|
v[i] %= divisor; |
|
|
|
} |
|
|
|
}); |
|
|
|
base.DoRemainder(divisor, result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -924,21 +907,21 @@ namespace MathNet.Numerics.LinearAlgebra.Double |
|
|
|
/// <param name="result">A vector to store the results in.</param>
|
|
|
|
protected override void DoRemainderByThis(double dividend, Matrix<double> result) |
|
|
|
{ |
|
|
|
var denseResult = result as DenseMatrix; |
|
|
|
if (denseResult == null) |
|
|
|
if (result is DenseMatrix denseResult) |
|
|
|
{ |
|
|
|
base.DoRemainderByThis(dividend, result); |
|
|
|
return; |
|
|
|
CommonParallel.For(0, _values.Length, 4096, (a, b) => |
|
|
|
{ |
|
|
|
var v = denseResult._values; |
|
|
|
for (int i = a; i < b; i++) |
|
|
|
{ |
|
|
|
v[i] = dividend % _values[i]; |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
CommonParallel.For(0, _values.Length, 4096, (a, b) => |
|
|
|
else |
|
|
|
{ |
|
|
|
var v = denseResult._values; |
|
|
|
for (int i = a; i < b; i++) |
|
|
|
{ |
|
|
|
v[i] = dividend%_values[i]; |
|
|
|
} |
|
|
|
}); |
|
|
|
base.DoRemainderByThis(dividend, result); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|