【问题标题】:Matrix multiplication alglib矩阵乘法算法
【发布时间】:2011-04-09 20:19:50
【问题描述】:

如何将两个矩阵与AlgLib相乘

【问题讨论】:

    标签: c# alglib


    【解决方案1】:

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

    无论如何,恐怕答案似乎是您需要使用cmatrixgemmrmatrixgemm(取决于您的矩阵是实数还是复数),如下所示:

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

    地点:

    • m,n,k 是矩阵的大小(Am by k, Bk by n, @98765434@34 @987654333 n)
    • 1 是乘积的乘积(如果您碰巧想要 3AB 而不是 AB,请将 3 放在那里)
    • A,0,0,0B,0,0,0 组是:矩阵、行偏移、列偏移、操作类型
      • 运算类型为0表示使用A或B,1表示使用转置,2表示使用共轭转置(当然rmatrixgemm不能使用2)
    • 下一个0 表示将 0*C 添加到结果中(如果您在此处输入 0,则 C 中的初始值将被完全忽略)
    • C 后面的两个0s 是行列偏移

    您可能会认为这种概括性是多余的,应该有一个更简单的函数来提供这些默认值。我不同意这一点,但据我所知,AlgLib 中没有这么简单的函数。您可能想自己编写(只需调用 rmatrixgemmcmatrixgemm)。

    (为什么这么多通用性?因为进行有效的矩阵乘法需要相当复杂的代码,而且它本质上与执行更通用的C=a.f(A).g(B)+b.C 操作所需的代码相同,而*matrixgemm 执行的操作有时甚至更多一般操作很有用。)

    编辑添加了一些可能有用的注释。

    • 偏移量使您可以对子矩阵进行处理。能够做到这一点在一些数值算法中很有用。我假设m,n,k 是您正在使用的子矩阵的大小;在一般情况下,它们与数组的维度相同,并且偏移量为零。
    • 在调用rmatrixgemmcmatrixgemm 之前,数组本身需要存在并具有适当的大小。至少,AB 当然可以; C 作为 ref 传递,因此如果输入时为 null,这些函数可能会创建它。
    • 您可能会从rmatrixgemmcmatrixgemm 的签名中想到AB 被复制,而C 是通过引用传递的,但如果我对C# 的语义并不完全混淆的话,它们是全部由(对象)引用有效传递。

    【讨论】:

    • 哇...我无法通过阅读手册来解决这个问题...谢谢
    • 对于一个不太通用、更简单的函数,始终可以创建一个在内部使用 rmatrixgemm 并带有硬编码虚拟参数的函数。
    【解决方案2】:

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

    【讨论】:

    • 输入矩阵不应该是alglib::integer_2d_array类型吗?
    【解决方案3】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 2017-09-12
    • 2015-06-17
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多