如何将两个矩阵与AlgLib
相乘答案 0 :(得分:8)
免责声明:我没有使用过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
组包括:矩阵,行偏移,列偏移,操作类型
rmatrixgemm
)0
说要向结果添加0 * C(如果你在这里加0那么C中的初始值就完全被忽略了)0
是行和列偏移您可能认为这种普遍性是过度的,应该有一个更简单的函数来提供这些默认值。我不同意这一点,但据我所知,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#的语义,它们都被(对象)引用有效地传递。答案 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函数集加载到任何访问程序中。这使得它对工作数据库非常方便和轻量级。