Матричное умножение alglib

Как мне умножить две матрицы с AlgLib

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 говорит добавить 0*C к результату (если вы поставите 0 здесь, то начальные значения в C полностью игнорируются)
  • два 0s после 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 в одну базу данных доступа, а затем установив ссылку на эту базу данных из текущей базы данных, где необходимы функции. Это делает его очень удобным и легким для рабочей базы данных.

Другие вопросы по тегам