0

Is there any Dgemm like matrix call that scales the a and b matrix? (A, B, C are scalars).

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

Bonus points is therer any reason this isn't supported or is it just uncommon in Linear-Algebra and therefor generally unwarranted?

2 Answers2

1

The standard BLAS interface does not provide a direct mean to scale both A and B matrices independently (in this jargon, they usually devote uppercase letters for matrices/vectors and lowercase for scalars). See the MKL cblas documentation for cblas_?gemm (it will be the same across BLAS implementations).

What you can do though is to generate the scaled version of B with an intermediate call, setting a and b to zero:

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

However, if you decompose the matrix multiplication into single operations (example in row-major order):

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];
    }
  }
}

You will see that the scaling affects both matrices' elements. Since scalar product is commutative and associative, using an a argument equal to the product of both your scalars has the same effect.

Jorge Bellon
  • 2,901
  • 15
  • 25
0

Yes, dgemm does this, by using a simple multiplication property. Just refer 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)
ztik
  • 3,482
  • 16
  • 34