Отказ от ответственности: я не использовал AlgLib;Я просто иду по тому, что говорит документация.Я был бы рад, если бы кто-то более эксперт поправил меня.
В любом случае, я боюсь, что ответ, по-видимому, заключается в том, что вам нужно использовать cmatrixgemm
или rmatrixgemm
(что зависит от того, используются ли ваши матрицы).являются действительными или сложными), например:
rmatrixgemm(m,n,k, 1, A,0,0,0, B,0,0,0, 0, C,0,0);
, где:
m
, n
, k
- размеры матриц (A
это m
на k
, B
это k
на n
, C
это m
на n
) - *
1
- это то, на что умножить продукт на(если вам нужно, скажем, 3AB вместо AB, поместите вместо этого 3
) - группы
A,0,0,0
и B,0,0,0
: матрица, смещение строки, смещение столбца, тип операции - тип операции 0 для использования A или B как есть, 1 для использования транспонирования и 2 для использования сопряженной транспонирования (конечно, вы не можете использовать 2 для
rmatrixgemm
)
- следующее
0
говорит добавить 0 * C к результату (если вы поставите 0 здесь, тогда начальные значения в C полностью игнорируются) - через два
0
с послеC - смещение строки и столбца
Возможно, вы думаете, что этот уровень общности излишен, и что должна быть более простая функция, обеспечивающая эти значения по умолчанию.Я бы с этим не согласился, но, насколько я понимаю, в AlgLib нет такой более простой функции.Возможно, вы захотите написать свой собственный (который просто вызовет rmatrixgemm
или cmatrixgemm
).
(Почему так много общего? Потому что для эффективного умножения матриц требуется довольно сложный код, и он по сути тот же самый, довольносложный код, поскольку вам нужно выполнить более общую операцию C=a.f(A).g(B)+b.C
, которую выполняет *matrixgemm
, а иногда и более общую операцию.)
РЕДАКТИРОВАНИЕ, чтобы добавить еще несколько замечаний, которые могут быть полезны.
- Смещения таковы, что вы можете работать с подматрицами.Возможность сделать это полезна в некоторых численных алгоритмах.Я предполагаю, что
m
, n
, k
- размеры используемых подматриц;в общем случае они будут такими же, как размеры ваших массивов, а смещения будут равны нулю. - Сами массивы должны существовать и иметь соответствующие размеры, прежде чем вы вызовете
rmatrixgemm
или cmatrixgemm
.По крайней мере, A
и B
определенно делают;C
передается как ref
, поэтому возможно, что эти функции создадут его, если оно null
при входе. - Из сигнатуры
rmatrixgemm
или cmatrixgemm
можно подумать, что A
и B
копируются, тогда как C
передается по ссылке, но если я не совсем запутался в семантике C #, они все эффективно передаются по (объектной) ссылке.