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

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

4 голосов
/ 10 апреля 2011

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

Ответы [ 3 ]

8 голосов
/ 10 апреля 2011

Отказ от ответственности: я не использовал 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 #, они все эффективно передаются по (объектной) ссылке.
3 голосов
/ 10 апреля 2011

Просто чтобы подтвердить, что Гареч написал:

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}}
0 голосов
/ 10 октября 2013

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

...