说我有两个矩阵A
和B
。我想计算矩阵乘积A * B
的对角元素并将其放置在预先分配的向量result
中。
是否有BLAS(或类似的)例程可以尽快执行此操作?
没有特定的例程。但是,您可以使用以下矩阵乘法的定义。
考虑C = AB
,并且a
ij
,b
ij
,c
ij
表示元素的第(i,j)
个元素相应的矩阵。在不失一般性的前提下,我将假设所有A
,B
,C
均为N
x N
密集矩阵。
然后,
c
ij
= sum k=0
N-1
([a
ik
,b
kj
)
因为您仅对角线条目感兴趣:
c
ii
= sum k=0
N-1
([a
ik
,b
ki
),对于i=1,...,N
换句话说,要计算矩阵i
的第C
个对角矩阵,您需要找到矩阵i
的第A
行与矩阵i
的第B
列之间的点积。这可以通过使用点积BLAS级别1功能?dot来实现。
res = ?dot(n, x, incx, y, incy)
让我们假设矩阵A
和B
是存储的[[列方式,并且可以通过指针*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
的增量。
注意:
A
,B
和C
具有不同的尺寸(但与矩阵乘法一致),则仅需进行少量修改。?dot
的调用应稍作更改?dot
函数。实际上,对于单精度或双精度实数,它将是sdot
或ddot
,对于?dotu的版本:cdotu
和zdotu
分别对于单精度和双精度的复数。N
x N
矩阵A
和B
的算法的瓶颈,这会让我感到惊讶。