GeMM
GeMM(通用矩阵乘法)方法实现了两个矩阵的一般乘法。 运算定义为 C ← α A B + β C,其中 A 和 B 矩阵可以选择转置。 配合矩阵 AB(MatMul)的正态乘法,假定 alpha 标量等于 1,beta 等于零。
GeMM 和 MatMul 在效率方面的主要区别在于,MatMul 总是创建一个新的矩阵/矢量对象,而 GeMM 使用现有的矩阵对象,且不会重新创建它。 因此,当您使用 GeMM 并为相应的矩阵预分配内存时,在操控相同的矩阵大小时,将不会重新分配内存。 这可能是 GeMM 在批量计算方面的一个重要优势,例如,在策略测试器中运行优化、或训练神经网络时。
与 MatMul 类似,GeMM 也有 4 个重载。 然而,第四次重载的语义已被修改,以便能够将垂直向量与水平向量相乘。
在现有的矩阵/矢量对象中,没有必要预先分配内存。 将在第一次调用 GeMM 时分配内存,并以零填充。
矩阵乘以矩阵: matrix C[M][N] = α * ( matrix A[M][K] * matrix B[K][N]) + β * matrix C[M][N]
bool matrix::GeMM(
|
向量乘以矩阵: vector C[N] = α * ( vector A[K] * matrix B[K][N]) + β * vector C[N]
bool vector::GeMM(
|
矩阵乘以向量: vector C[M] = α * ( matrix A[M][K] * vector B[K] * ) + β * vector C[M]
bool vector::GeMM(
|
向量乘以向量: matrix C[M][N] = α * ( vector A[M] * vector B[N] * ) + β * matrix C[M][N]. 此重载返回一个矩阵,与 MatMul 不同,它返回一个标量。
bool matrix::GeMM(
|
参数
A
[输入] 矩阵或向量。
B
[输入] 矩阵或向量。
alpha
[输入] AB 乘积的阿尔法乘数。
beta
[输入] 所得 C 矩阵的贝塔乘数。
flags
[输入] 确定是否转置矩阵 A、B 和 C 的 ENUM_GEMM 枚举值。
返回值
成功返回 true,否则 false。
GeMM 方法的标志枚举。
ID |
说明 |
---|---|
TRANSP_A |
使用转置矩阵 A |
TRANSP_B |
使用转置矩阵 B |
TRANSP_C |
使用转置矩阵 C |
注意
浮点型、双精度型和复数类型的矩阵和向量可以用作参数 A 和 B。GeMM 方法的模板变体如下:
bool matrix<T>::GeMM(const matrix<T> &A,const matrix<T> &B,T alpha,T beta,ulong flags);
|
基本上一般的矩阵乘法函数描述为:
C[m,n] = α *Sum(A[m,k]*B[k,n]) + β*C[m,n] |
配合以下尺寸:矩阵 A 为 M x K,矩阵 B 为 K x N,矩阵 C 为 M x N。
因此,矩阵应该与乘法兼容,即第一个矩阵中的列数应等于第二个矩阵中的行数。 矩阵乘法不支持交换律:在一般情况下,将第一个矩阵乘以第二个矩阵的结果不等于将第二个矩阵乘以第一个矩阵的结果。
示例:
void OnStart()
|
参见