Однако я заметил, что умножение матриц с использованием этой библиотеки происходит значительно медленнее по сравнению с обычным скалярным умножением или операциями, которые я выполнял. реализовано вручную.
Вот упрощенный пример кода:
Код: Выделить всё
using MathNet.Numerics.LinearAlgebra;
public List
ToSomething(
MathN.Matrix matrixA,
MathN.Matrix matrixB,
List points)
{
MathN.Matrix matrixC = MathN.Matrix.Build.Dense(4, points.Count, 1);
for (int i = 0; i < points.Count; i++)
{
// some code assigning matrixC values
}
// Using MathNet.Numerics for matrix multiplication
var resMat = (matrixA * matrixB) * matrixC; // Takes significantly more time
var ptsInPcs = new List(resMat.ColumnCount);
// some other code
return ptsInPcs;
}
Для например, при использовании базового подхода с вложенным циклом, например:
Код: Выделить всё
// Custom matrix multiplication method for 1D arrays
public List
ToSomethingFlatArray(
float[] matrixA,
float[] matrixB,
List point)
{
int numPoints = point.Count;
float[] tempMatrixA = new float[4 * numPoints];
float[] tempMatrixB = new float[4 * numPoints];
float[] tempMatrixC = new float[4 * 4];
for (int i = 0; i < numPoints; i++)
{
// some code
}
MatrixMultiply(matrixA, 4, 4, matrixB, 4, 4, tempMatrixC);
MatrixMultiply(tempMatrixC, 4, 4, tempMatrixA, 4, numPoints, tempMatrixB);
var ptsInPcs = new List(numPoints);
// some other code
return ptsInPcs;
}
static void MatrixMultiply(float[] A, int aRows, int aCols, float[] B, int bRows, int bCols, float[] result)
{
if (aCols != bRows)
throw new ArgumentException("Matrix dimensions are not compatible for multiplication.");
for (int i = 0; i < aRows; i++)
{
int aRowOffset = i * aCols;
int resultRowOffset = i * bCols;
for (int j = 0; j < bCols; j++)
{
float sum = 0;
for (int k = 0; k < aCols; k++)
{
sum += A[aRowOffset + k] * B[k * bCols + j];
}
result[resultRowOffset + j] = sum;
}
}
}

Вопросы:
Известна ли эта проблема с MathNet.Numerics?
Существуют ли в MathNet методы оптимизации или настройки, которые могут улучшить матричное умножение производительность?
Может ли другая библиотека или специальная реализация обеспечить более высокую производительность для матричных операций в C#?
Подробнее здесь: https://stackoverflow.com/questions/792 ... -multiplic