Почему умножение матриц с помощью MathNet.Numerics выполняется медленнее, чем обычное умножение?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему умножение матриц с помощью MathNet.Numerics выполняется медленнее, чем обычное умножение?

Сообщение Anonymous »

Я использую библиотеку MathNet.Numerics в своем приложении C# для выполнения матричных операций.
Однако я заметил, что умножение матриц с использованием этой библиотеки происходит значительно медленнее по сравнению с обычным скалярным умножением или операциями, которые я выполнял. реализовано вручную.
Вот упрощенный пример кода:

Код: Выделить всё

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;
}
Я ожидал, что библиотека MathNet.Numerics будет эффективно выполнять умножение матриц, но, похоже, она требует значительных накладных расходов по сравнению с базовой пользовательской реализацией.
Для например, при использовании базового подхода с вложенным циклом, например:

Код: Выделить всё

// 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему умножение матриц с помощью MathNet.Numerics выполняется медленнее, чем обычное умножение?
    Anonymous » » в форуме C#
    0 Ответы
    54 Просмотры
    Последнее сообщение Anonymous
  • Как нормализовать матрицу в C# с помощью Mathnet.Numerics?
    Anonymous » » в форуме C#
    0 Ответы
    46 Просмотры
    Последнее сообщение Anonymous
  • Как использовать MathNet.Numerics, чтобы найти все частоты сигнала?
    Anonymous » » в форуме C#
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Как использовать MathNet.Numerics, чтобы найти все частоты сигнала?
    Anonymous » » в форуме C#
    0 Ответы
    56 Просмотры
    Последнее сообщение Anonymous
  • Как я могу использовать cuda в mathnet.numerics?
    Anonymous » » в форуме C#
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»