BLAS例程仅计算矩阵乘积的对角线元素?

问题描述 投票:1回答:1

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

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

linear-algebra blas
1个回答
0
投票

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

考虑C = AB,并且a ijb ijc ij表示元素的第(i,j)个元素相应的矩阵。在不失一般性的前提下,我将假设所有ABC均为N x N密集矩阵。

然后,

c ij = sum k=0 N-1([a ikb kj

因为您仅对角线条目感兴趣:

c ii = sum k=0 N-1([a ikb ki ),对于i=1,...,N

换句话说,要计算矩阵i的第C个对角矩阵,您需要找到矩阵i的第A行与矩阵i的第B列之间的点积。这可以通过使用点积BLAS级别1功能?dot来实现。

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

让我们假设矩阵AB是存储的[[列方式,并且可以通过指针*A*B(保存N*N值)进行访问,而*C是预先分配的存储矩阵C的对角线条目(保存N值)。

以下循环应为您提供对角线:

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

注意,我们通过传递第i行的第一个元素:A,并使用i的增量(A[i])访问矩阵incx的第N行。相反,要访问矩阵i的第B列,我们传递第i列的第一个元素:B[i*N]并使用1的增量。


注意:

    如果ABC具有不同的尺寸(但与矩阵乘法一致),则仅需进行少量修改。
  • 如果矩阵按行存储,则对?dot的调用应稍作更改
  • 上面的伪代码使用常规的?dot函数。实际上,对于单精度或双精度实数,它将是sdotddot,对于?dotu的版本:cdotuzdotu分别对于单精度和双精度的复数。
  • 这是最高效,最易于缓存的等实现吗?可能不会,但是如果这成为其中已经明确计算了N x N矩阵AB的算法的瓶颈,这会让我感到惊讶。
© www.soinside.com 2019 - 2024. All rights reserved.