矩阵乘法alglib

如何将两个矩阵与AlgLib相乘

免责声明:我没有使用过AlgLib; 我只是按照文档似乎说的去做。 我很乐意被更专家的人纠正。

无论如何,我担心答案似乎是你需要使用cmatrixgemmrmatrixgemm (哪一个取决于你的矩阵是真的还是复杂的),如下所示:

 rmatrixgemm(m,n,k, 1, A,0,0,0, B,0,0,0, 0, C,0,0); 

哪里:

  • mnk是矩阵的大小( AmkBknCmn
  • 1是乘以产品的乘法(如果你碰巧想要,比如说3AB而不是AB,那么就把3放在那里)
  • A,0,0,0B,0,0,0组是:矩阵,行偏移,列偏移,操作类型
    • 操作类型为0,原样使用A或B,1使用转置,2使用共轭转置(当然你不能使用2作为rmatrixgemm
  • 下一个0表示在结果中添加0 * C(如果你在这里加0那么C中的初始值完全被忽略)
  • C之后的两个0是行和列的偏移量

您可能认为这种普遍性是过度的,应该有一个更简单的函数来提供这些默认值。 我不同意这一点,但据我所知,AlgLib中没有这么简单的function。 您可能想要自己编写(只需调用rmatrixgemmcmatrixgemm )。

(为什么如此普遍?因为做一个有效的矩阵乘法需要相当复杂的代码,并且它基本上是相同的非常复杂的代码,你需要做更通用的C=af(A).g(B)+bC操作*matrixgemm是的,有时更普遍的操作是有用的。)

编辑以添加一些可能有用的备注。

  • 偏移量使您可以使用子矩阵执行操作。 能够这样做在一些数值算法中是有用的。 我假设mnk是你正在使用的子矩阵的大小; 在常见情况下,它们将与数组的尺寸相同,偏移量将为零。
  • 在调用rmatrixgemmcmatrixgemm之前,arrays本身需要存在且大小合适。 至少, AB肯定会这样做; C作为ref传递,因此如果它在入口处为null ,则这些函数可能会创建它。
  • 您可能会从rmatrixgemmcmatrixgemm的签名中认为AB被复制而C通过引用传递,但如果我对C#的语义并不完全混淆,它们都会被(对象)引用有效地传递。

只是为了确认Garech所写的内容:

 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模块加载到一个访问数据库中,然后从需要这些function的当前数据库设置对该数据库的引用,可以将整个alglib函数集加载到任何访问程序中。 这使得它对工作数据库非常方便和轻量级。

Interesting Posts