【问题标题】:BLAS Functions Dgemm but all matrices are multiplied by a ScalarBLAS 函数 Dgemm 但所有矩阵都乘以标量
【发布时间】:2018-01-23 21:27:57
【问题描述】:

是否有任何类似 Dgemm 的矩阵调用来缩放 a 和 b 矩阵? (A、B、C 是标量)。

IE c = C * c + (A*op(a)) * (B*op(b));

加分点是否有任何理由不支持,或者它在线性代数中不常见,因此通常是没有根据的?

【问题讨论】:

    标签: c++ blas cblas


    【解决方案1】:

    标准 BLAS 接口不提供独立缩放AB 矩阵的直接方法(在这个行话中,它们通常将大写字母用于矩阵/向量,将小写字母用于标量)。请参阅MKL cblas documentation for cblas_?gemm(在 BLAS 实现中都是相同的)。

    您可以做的是通过中间调用生成B 的缩放版本,将ab 设置为零:

    C = c.*C + (0.*A) * (0.*B)
    

    但是,如果您将矩阵乘法分解为单个操作(以行优先顺序为例):

    for( i = 0; i < N; i++ ) {
      for( j = 0; j < M; j++ ) {
        for( ii = 0; ii < K; ii++ ) {
          C[i][j] = C[i][j] + a*A[i][ii]*B[ii][j];
        }
      }
    }
    

    您将看到缩放影响两个矩阵的元素。由于标量积是可交换和关联的,因此使用等于两个标量积的 a 参数具有相同的效果。

    【讨论】:

      【解决方案2】:

      是的,dgemm 通过使用简单的乘法属性来做到这一点。请参考here

      c = C*c + (A*op(a))*(B*op(b))
      c = C*c + A*(op(a))*B)*op(b)
      c = C*c + A*(B*op(a))*op(b)
      c = C*c + (A*B)*op(a)*op(b)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-10
        • 2018-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多