Есть ли Dgemm как матричный вызов, который масштабирует матрицу a и b?
(A, B, C — скаляры).
IE
c = C * c + (A * op (a)) * (B * op (b));
Бонусные баллы есть какая-то причина, по которой это не поддерживается или это просто необычно в линейной алгебре и поэтому вообще необоснованно?
Стандартный интерфейс 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
Аргумент, равный произведению обоих ваших скаляров, имеет одинаковый эффект.
Да, 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)