3 ответа
Отказ от ответственности: я не использовал 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, чтобы использовать A или B как есть, 1, чтобы использовать транспозицию, и 2, чтобы использовать сопряженную транспозицию (конечно, вы не можете использовать 2 для
- следующий
0
говорит добавить 0*C к результату (если вы поставите 0 здесь, то начальные значения в C полностью игнорируются) - два
0
s после 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#, все они эффективно передаются по (объектной) ссылке.
Просто чтобы подтвердить то, что написал Гареч:
double[,] a = new double[,] {
{1,2,3},
{4,5,6}
};
double[,] b = new double[,] {
{7,8,9,10},
{11,12,13,14},
{15,16,17,18}
};
int m = a.GetLength(0);
int n = b.GetLength(1);
int k = a.GetLength(1);
double[,] c = new double[m,n];
alglib.rmatrixgemm(m, n, k, 1, a, 0,0,0, b,0,0,0, 0, ref c, 0,0);
//c = {{74, 80, 86, 92}, {173, 188, 203, 218}}
В VBA я смог использовать сложную версию этой функции.
Alpha.x = 1: Alpha.y = 0
Beta.x = 0: Beta.y = 0
Call CMatrixGEMM(4, 1, 4, Alpha, r, 0, 0, 0, x, 0, 0, 0, Beta, RX, 0, 0)
В качестве дополнительного примечания весь набор функций alglib можно загрузить в любую программу доступа, загрузив все модули alglib в одну базу данных доступа, а затем установив ссылку на эту базу данных из текущей базы данных, где необходимы функции. Это делает его очень удобным и легким для рабочей базы данных.