C# 矩阵乘法

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、

如何将两个矩阵相乘?免责声明:我没有使用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
    by
    k
    B
    k
    by
    n
    C
    m
    by
    n
  • 1
    是乘积的乘积(如果你碰巧想要3AB而不是AB,那么就把
    3
    放在那里)
  • A、0,0,0
    B、0,0,0
    组为:矩阵、行偏移、列偏移、操作类型
    • 操作类型为0以使用A或B,1以使用转置,2以使用共轭转置(当然,您不能将2用于
      rmatrixgemm
  • 下一个
    0
    表示将0*C添加到结果中(如果在此处输入0,则完全忽略C中的初始值)
  • C后面的两个
    0
    s是行和列偏移量
您可能会认为这种通用性水平有些过分,应该有一个更简单的函数来提供这些默认值。我不反对这一点,但据我所知,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的语义没有完全混淆的话,它们实际上都是通过(对象)引用传递的

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

wow。。。我不可能通过阅读手册就知道。。。感谢一个不太通用、更简单的函数,始终可以创建一个在内部使用硬编码伪参数的函数。
rmatrixgemm
。该库也可用于vb6:输入矩阵是否不是
alglib::integer\u 2d\u array
类型?