首页 > 解决方案 > BLAS例程仅计算矩阵产品的对角线元素?

问题描述

假设我有两个矩阵AB。我想计算矩阵乘积的对角元素A * B并将它们放在预先分配的向量result中。

是否有 BLAS(或类似的)例程可以尽可能快地执行此操作?

标签: linear-algebrablas

解决方案


没有具体的例程。但是,您可以使用以下矩阵乘法的定义。

考虑C = AB, 和aij,bijcij表示(i,j)相应矩阵的第 th 个元素。不失一般性,我假设所有A, B,C都是Nx 个N稠密矩阵。

然后,

cij= 总和( , )k=0N-1aikbkj

由于您只对对角线条目感兴趣:

cii= 总和( , ), 对于k=0N-1aikbkii=1,...,N

换句话说,要计算matrix 的i第 th 对角矩阵,C您需要在matrix 的i第 th 行和 matrixAi第 th 列之间找到一个点积B。这可以通过使用点积 BLAS level-1 函数?dot来实现。

res = ?dot(n, x, incx, y, incy)

让我们假设矩阵A和是按列B存储的,并且可以通过指针访问和(保存值),而是矩阵的对角线条目(保存值)的预分配存储。*A*BN*N*CCN

下面的循环应该给你对角线:

for (int i=0;i<N;i++)
{
    C[i] = ?dot(N,A[i],N,B[i*N],1);
}

请注意,我们通过传递第 th 行的第一个元素来访问i矩阵的第 th 行:,并使用 increment ( ) of 。相反,要访问矩阵的第 th 列,我们传递第 th 列的第一个元素:并使用 的增量。AiA[i]incxNiBiB[i*N]1


笔记:

  • 如果ABC具有不同的(但与矩阵乘法一致)维度,则只需稍作修改即可。
  • 如果矩阵按行存储,?dot则应稍微更改对的调用
  • 上面的伪代码使用了一个通用?dot函数。在实践中,它将是sdotddot用于单精度或双精度实数,以及?dotu的版本:cdotu以及zdotu分别用于单精度和双精度的复数。
  • 它是最有效的、缓存友好的等实现吗?可能不会,但是如果这成为NxN矩阵A并且B无论如何都已明确计算的算法中的瓶颈,我会感到惊讶。

推荐阅读