Оптимизация умножения матриц в vb.net

#vb.net #optimization

#vb.net #оптимизация

Вопрос:

В настоящее время я пытаюсь выполнить некоторую работу над классом нейронной сети в Visual Basic. Моя главная проблема на данный момент заключается в том, что умножение матриц происходит так медленно! Вот код, который я использую прямо сейчас;

    Public Function MultiplyMatricesParallel(ByVal matA As Double()(), ByVal matB As Double()()) As Double()()
    Dim matACols As Integer = matA(0).GetLength(0)
    Dim matBCols As Integer = matB(0).GetLength(0)
    Dim matARows As Integer = matA.GetLength(0)
    Dim result(matARows - 1)() As Double
    For i = 0 To matARows - 1
        ReDim result(i)(matBCols - 1)
    Next
    Dim tempMat()() As Double = MatrixTranspose(matB)
    Parallel.For(0, matARows, Sub(i)
                                  For j As Integer = 0 To matBCols - 1
                                      Dim temp As Double = 0
                                      Dim maA() As Double = matA(i)
                                      Dim maB() As Double = tempMat(j)
                                      For k As Integer = 0 To matACols - 1
                                          temp  = maA(k) * maB(k)
                                      Next
                                      result(i)(j)  = temp
                                  Next
                              End Sub)
    Return result
End Function
  

Я просто вырезал массивы, поскольку они быстрее в vb, чем прямоугольные массивы. Конечно, они действительно прямоугольные, иначе умножение матриц не работало бы (или не имело смысла). Будем признательны за любой совет / помощь, для справки размер матрицы может меняться, но в настоящее время он составляет около 7000 x 2000 максимум.

Комментарии:

1. В .Net встроен предварительно оптимизированный матричный тип .

2. @JoelCoehoorn спасибо, я видел это раньше, но это всегда выглядело немного громоздко (как бы мне динамически инициализировать матрицу, например?).

3. Это действительно плотная матрица? Разве это не должно быть разреженным? Это может помочь сохранить данные в виде плоского массива, а не неровного.

4. Это действительно плотная матрица (значения в каждом отдельном месте). Под плоским массивом вы подразумеваете что-то вроде dim m (14000) как double?