【问题标题】:BLAS routine to compute diagonal elements only of a matrix product?BLAS例程仅计算矩阵乘积的对角线元素?
【发布时间】:2019-11-23 11:31:54
【问题描述】:

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

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

【问题讨论】:

  • 这类问题可以通过Computational Science SE 更好地找到听众。在那里输入公式更容易:) 虽然 Computational Science SE 不喜欢这种类型的问题:“如何使用这个库在 C 中实现某些东西”,但关于 BLAS/LAPACK 的问题很常见。

标签: linear-algebra blas


【解决方案1】:

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

考虑C = ABaijbijcij表示相应矩阵的(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

换句话说,要计算矩阵Cith 对角矩阵,您需要在矩阵Aith 行和矩阵@987654358 的ith 列之间找到一个点积@。这可以通过使用点积 BLAS 1 级函数 ?dot 来实现。

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

让我们假设矩阵AB 存储在按列 并且可以通过指针*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)来访问矩阵Aith 行。相反,要访问矩阵Bith 列,我们传递ith 列的第一个元素:B[i*N] 并使用1 的增量。


注意事项:

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

【讨论】:

    猜你喜欢
    • 2014-07-17
    • 2011-01-19
    • 2014-03-09
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    相关资源
    最近更新 更多