gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:38:19 26 4
gpt4 key购买 nike

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

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

最佳答案

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

考虑 C = AB , 和 a <子> ij , b <子> ij , c <子> ij 表示 (i,j)相应矩阵的第 th 个元素。不失一般性,我假设所有 A , B , CN x N稠密矩阵。

然后,

c <子> ij = 总和 k=0 N-1 ( a ik , b kj )

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

c <子> ii = 总和 k=0 N-1 ( a ik , b ki ), 对于 i=1,...,N

换句话说,计算i矩阵的第 th 对角矩阵 C你需要在 i 之间找到点积矩阵的第行Ai矩阵的第 列 B .这可以通过使用点积 BLAS level-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 的增量.


注意事项:

  • 如果A , B , 和 C具有不同的(但与矩阵乘法一致)维度,只需进行轻微的修改。
  • 如果矩阵按行存储,调用?dot应该稍微改变一下
  • 上面的伪代码使用了一个通用的?dot功能。实际上,它将是 sdotddot对于单精度或 double 实数,以及 ?dotu 的版本: cdotuzdotu分别用于单精度和 double 的复数。
  • 它是最高效、缓存友好等的实现吗?可能不会,但如果这成为 N 算法的瓶颈,我会感到惊讶。 x N矩阵 AB无论如何都已明确计算。

关于linear-algebra - 仅计算矩阵乘积的对角线元素的 BLAS 例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59007147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com