Из вашего кода довольно сложно понять, чего вы пытаетесь достичь.Я думаю, что вы хотите вычислить матрицу d[0..m, 0..n]
следующим образом:
+---------+-------------------------+
| 0.0 | b00 b10 ...... b(n-1)0 |
+---------+-------------------------+
| a00 | d11 d12 ...... d1n |
| a10 | d21 d22 ...... d2n |
| ... | ... ... ...... ... |
| ... | ... ... ...... ... |
| ... | ... ... ...... ... |
| a(m-1)0 | dm1 dm2 ...... dmn |
+---------+-------------------------+
, где основная часть (внутренняя матрица d[1..m, 1..n]
) является умножением трех матриц matA1
(matA
после обрезки)первые столбцы), matC
и matB1
(matB
после обрезки первого столбца и транспонирования).
Чтобы понять матричную работу, хорошим способом будет рассуждать о размере матрицы.Пусть ra
, ca
, rb
, cb
, rc
и cc
обозначают количество строк и столбцов в matA
, matB
и matC
соответственно.Умножение относится к трем матрицам размером ra x (ca-1)
, rc x cc
и (cb-1) x rb
;это имеет смысл только если rc = ca-1
и cc = cb-1
.У нас есть полученная матрица d
размера (ra+1) x (rb+1)
.
Вот моя попытка без использования какой-либо петли for
:
let calculate (matA : matrix) (matB : matrix) (matC : matrix) =
let ra = matA.NumRows
let ca = matA.NumCols
let rb = matB.NumRows
let cb = matB.NumCols
let matrixCalcul = Matrix.zero (ra+1) (rb+1)
matrixCalcul.[1.., 0..0] <- matA.[0.., 0..0]
matrixCalcul.[0..0, 1..] <- matB.[0.., 0..0].Transpose
matrixCalcul.[1.., 1..] <- (matA.Columns(1, ca-1) * matC) * matB.Columns(1, cb-1).Transpose
matrixCalcul
Я тестировал с matA
, matB
и matC
размером 200х279, 200х1279 и 278х1238 соответственно.Две версии дают одинаковый результат, и моя функция на 40x
быстрее, чем оригинальная.Для этого есть много причин, но в целом векторизованная версия имеет гораздо лучшую производительность, когда дело доходит до вычисления матрицы.