BLAS Функции Dgemm, но все матрицы умножаются на скаляр

Есть ли Dgemm как матричный вызов, который масштабирует матрицу a и b?
(A, B, C — скаляры).

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

Бонусные баллы есть какая-то причина, по которой это не поддерживается или это просто необычно в линейной алгебре и поэтому вообще необоснованно?

0

Решение

Стандартный интерфейс BLAS не предоставляет прямого средства для масштабирования A а также B матрицы независимо (на этом жаргоне они обычно выделяют заглавные буквы для матриц / векторов и строчные для скаляров). Увидеть MKL cblas документация для cblas_? Gemm (это будет одинаковым для всех реализаций BLAS).

Однако вы можете создать уменьшенную версию B с промежуточным звонком, настройка a а также b в ноль:

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 Аргумент, равный произведению обоих ваших скаляров, имеет одинаковый эффект.

1

Другие решения

Да, dgemm делает это, используя простое свойство умножения. Просто сослаться Вот.

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)
0