C# 矩阵乘法
如何将两个矩阵相乘?免责声明:我没有使用AlgLib;我只是按照文件上说的去做。我很乐意被更专业的人纠正 无论如何,我担心答案似乎是您需要使用C# 矩阵乘法,c#,alglib,C#,Alglib,如何将两个矩阵相乘?免责声明:我没有使用AlgLib;我只是按照文件上说的去做。我很乐意被更专业的人纠正 无论如何,我担心答案似乎是您需要使用cmatrixgemm或rmatrixgemm(哪一个取决于您的矩阵是实矩阵还是复矩阵),如下所示: rmatrixgemm(m,n,k, 1, A,0,0,0, B,0,0,0, 0, C,0,0); 其中: m,n,k是矩阵的大小(A是mbyk,B是kbyn,C是mbyn) 1是乘积的乘积(如果你碰巧想要3AB而不是AB,那么就把3放在那里) A、
cmatrixgemm
或rmatrixgemm
(哪一个取决于您的矩阵是实矩阵还是复矩阵),如下所示:
rmatrixgemm(m,n,k, 1, A,0,0,0, B,0,0,0, 0, C,0,0);
其中:
,m
,n
是矩阵的大小(k
是A
bym
,k
是B
byk
,n
是C
bym
)n
是乘积的乘积(如果你碰巧想要3AB而不是AB,那么就把1
放在那里)3
和A、0,0,0
组为:矩阵、行偏移、列偏移、操作类型B、0,0,0
- 操作类型为0以使用A或B,1以使用转置,2以使用共轭转置(当然,您不能将2用于
)rmatrixgemm
- 操作类型为0以使用A或B,1以使用转置,2以使用共轭转置(当然,您不能将2用于
- 下一个
表示将0*C添加到结果中(如果在此处输入0,则完全忽略C中的初始值)0
- C后面的两个
s是行和列偏移量0
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
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模块加载到一个access数据库中,然后从需要函数的当前数据库中设置对该数据库的引用,可以将整套alglib函数加载到任何access程序中。这使得工作数据库非常方便和轻量级。wow。。。我不可能通过阅读手册就知道。。。感谢一个不太通用、更简单的函数,始终可以创建一个在内部使用硬编码伪参数的函数。
rmatrixgemm
。该库也可用于vb6:输入矩阵是否不是alglib::integer\u 2d\u array
类型?