没有具体的例程。但是,您可以使用以下矩阵乘法的定义。
考虑C = AB、aij、bij、cij表示相应矩阵的(i,j)th 元素。不失一般性,我假设所有A,B,C 都是N x N 密集矩阵。
那么,
cij = sumk=0N-1 (aik子>,bkj)
由于您只对对角线条目感兴趣:
cii = sumk=0N-1 (aik sub>,bki),对于i=1,...,N
换句话说,要计算矩阵C 的ith 对角矩阵,您需要在矩阵A 的ith 行和矩阵@987654358 的ith 列之间找到一个点积@。这可以通过使用点积 BLAS 1 级函数 ?dot 来实现。
res = ?dot(n, x, incx, y, incy)
让我们假设矩阵A 和B 存储在按列 并且可以通过指针*A 和*B(它们保存N*N 值)访问,而@987654365 @ 是矩阵 C 的对角线条目的预分配存储空间(其中包含 N 值)。
下面的循环应该给你对角线:
for (int i=0;i<N;i++)
{
C[i] = ?dot(N,A[i],N,B[i*N],1);
}
注意,我们通过传递ith 行的第一个元素:A[i],并使用N 的增量(incx)来访问矩阵A 的ith 行。相反,要访问矩阵B 的ith 列,我们传递ith 列的第一个元素:B[i*N] 并使用1 的增量。
注意事项:
- 如果
A、B 和C 的维度不同(但与矩阵乘法一致),则只需稍作修改即可。
- 如果矩阵是按行存储的,对
?dot 的调用应该稍微改变
- 上面的伪代码使用了一个通用的
?dot 函数。在实践中,对于单精度或双精度实数,它将是 sdot 或 ddot,对于单精度和双精度复数,分别是 ?dotu:cdotu 和 zdotu。
- 它是最有效的、缓存友好的等实现吗?可能不会,但如果这成为算法中的瓶颈,我会感到惊讶,其中
NxN 矩阵A 和B 无论如何都已明确计算。