能否通过矩阵-向量运算计算对称矩阵AA^T且保持最少flops?
用矩阵-向量运算计算AAᵀ的可行性说明
结论:完全可以实现,且不会产生不必要的冗余乘法运算,运算量和最优标量计算逻辑一致
具体实现逻辑
- 对角线元素计算:对每个
i ∈ [1,n],取A的第i行向量A[i,:],执行矩阵-向量运算A[i,:] @ A[i,:].T,直接得到C[i,i]。这一步共执行n次向量内积,完全无冗余计算。 - 下三角非对角元素计算:对每个
i ∈ [2,n],遍历j ∈ [1,i-1],执行矩阵-向量运算A[i,:] @ A[j,:].T得到C[i,j]。这一步共执行n(n-1)/2次向量内积,仅覆盖需要计算的下三角区域,不会触发上三角元素的乘法运算。 - 上三角赋值:利用对称性直接令
C[j,i] = C[i,j],该步骤只有内存拷贝操作,无浮点运算开销。
运算量验证
长度为n的向量内积单次浮点运算量为2n-1次(n次乘法+ n-1次加法),总运算次数为n + n(n-1)/2 = n(n+1)/2次,总浮点运算量刚好为(2n-1) * n(n+1)/2,和你提到的最优标量计算的运算量完全一致,没有额外开销。
工程实现提示
如果基于优化线性代数库实现,不要调用通用gemm矩阵乘法接口,该接口默认计算完整n×n矩阵会产生冗余运算。你可以循环调用向量内积接口(本质就是行向量乘列向量的矩阵-向量运算),或者直接调用专门的对称秩k更新接口syrk,后者底层已经实现了对称矩阵的优化计算逻辑,不会产生冗余运算。
内容的提问来源于stack exchange,提问作者Tesslaqwe
相关产品推荐
相关产品推荐

