矩阵乘法alglib

时间:2011-04-09 20:19:51

标签: c# alglib

如何将两个矩阵与AlgLib

相乘

3 个答案:

答案 0 :(得分:8)

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

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

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

其中:

  • mnk是矩阵的大小(Am kB knCm n}
  • 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中没有这么简单的功能。您可能想要自己编写(只需拨打rmatrixgemmcmatrixgemm)。

(为什么如此普遍?因为进行有效的矩阵乘法需要相当复杂的代码,并且它基本上与您需要执行C=a.f(A).g(B)+b.C执行的更一般*matrixgemm操作的相当复杂的代码相同,有时更普遍的操作是有用的。)

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

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

答案 1 :(得分:3)

只是为了确认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}}

答案 2 :(得分:0)

在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函数集加载到任何访问程序中。这使得它对工作数据库非常方便和轻量级。