如何将两个矩阵与AlgLib 相乘
问问题
6842 次
3 回答
9
免责声明:我没有使用过 AlgLib;我只是按照文档似乎所说的去做。我很乐意被更专业的人纠正。
无论如何,恐怕答案似乎是您需要使用cmatrixgemm
or rmatrixgemm
(取决于您的矩阵是实数还是复数),如下所示:
rmatrixgemm(m,n,k, 1, A,0,0,0, B,0,0,0, 0, C,0,0);
在哪里:
m
,n
,k
是矩阵的大小 (A
ism
byk
,B
isk
byn
,C
ism
byn
)- 这
1
是乘积乘以的内容(如果您碰巧想要 3AB 而不是 AB,则放在3
那里) - 和组是:矩阵
A,0,0,0
、B,0,0,0
行偏移、列偏移、操作类型- 操作类型为 0 使用 A 或 B,1 使用转置,2 使用共轭转置(当然你不能使用 2
rmatrixgemm
)
- 操作类型为 0 使用 A 或 B,1 使用转置,2 使用共轭转置(当然你不能使用 2
- 下一个
0
说将 0*C 添加到结果中(如果您将 0 放在这里,则 C 中的初始值将被完全忽略) - C 后面的两个
0
s 是行列偏移
您可能会认为这种概括性是多余的,应该有一个更简单的函数来提供这些默认值。我不同意这一点,但据我所知,AlgLib 中没有这么简单的函数。您可能想编写自己的(只需调用rmatrixgemm
or cmatrixgemm
)。
(为什么有这么多通用性?因为进行有效的矩阵乘法需要非常复杂的代码,并且它本质上与您需要执行更通用的C=a.f(A).g(B)+b.C
操作相同的非常复杂的代码*matrixgemm
,有时更通用的操作很有用。)
编辑添加一些可能有用的评论。
- 偏移量使您可以使用子矩阵进行操作。能够做到这一点在一些数值算法中很有用。我假设
m
,n
是k
您正在使用的子矩阵的大小;在常见情况下,它们将与数组的维度相同,并且偏移量为零。 rmatrixgemm
在调用or之前,数组本身需要存在并具有适当的大小cmatrixgemm
。至少,A
而且B
肯定会这样做;C
作为 a 传递,ref
因此如果它null
在条目中,这些函数可能会创建它。- 您可能会从
rmatrixgemm
orcmatrixgemm
that的签名中想到A
并被B
复制,而C
通过引用传递,但如果我对 C# 的语义并不完全混淆,它们都是通过(对象)引用有效传递的。
于 2011-04-09T20:39:53.167 回答
4
只是为了确认 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}}
于 2011-04-09T22:44:58.093 回答
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 函数集加载到任何访问程序中。这使得工作数据库非常方便和轻量级。
于 2013-10-09T20:30:11.660 回答