linear-algebra - BLAS例程仅计算矩阵产品的对角线元素?
问题描述
假设我有两个矩阵A
和B
。我想计算矩阵乘积的对角元素A * B
并将它们放在预先分配的向量result
中。
是否有 BLAS(或类似的)例程可以尽可能快地执行此操作?
解决方案
没有具体的例程。但是,您可以使用以下矩阵乘法的定义。
考虑C = AB
, 和a
ij
,b
ij
来c
ij
表示(i,j)
相应矩阵的第 th 个元素。不失一般性,我假设所有A
, B
,C
都是N
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
换句话说,要计算matrix 的i
第 th 对角矩阵,C
您需要在matrix 的i
第 th 行和 matrixA
的i
第 th 列之间找到一个点积B
。这可以通过使用点积 BLAS level-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);
}
请注意,我们通过传递第 th 行的第一个元素来访问i
矩阵的第 th 行:,并使用 increment ( ) of 。相反,要访问矩阵的第 th 列,我们传递第 th 列的第一个元素:并使用 的增量。A
i
A[i]
incx
N
i
B
i
B[i*N]
1
笔记:
- 如果
A
、B
和C
具有不同的(但与矩阵乘法一致)维度,则只需稍作修改即可。 - 如果矩阵按行存储,
?dot
则应稍微更改对的调用 - 上面的伪代码使用了一个通用
?dot
函数。在实践中,它将是sdot
或ddot
用于单精度或双精度实数,以及?dotu的版本:cdotu
以及zdotu
分别用于单精度和双精度的复数。 - 它是最有效的、缓存友好的等实现吗?可能不会,但是如果这成为
N
xN
矩阵A
并且B
无论如何都已明确计算的算法中的瓶颈,我会感到惊讶。
推荐阅读
- python - 我的 For 循环返回错误的预期结果
- ffmpeg - FFMPEG concat 过滤器具有未连接的音频输出
- javascript - 有没有办法在数据更新时保留 PrimeNG 表滚动位置?
- react-native - 在 React-Native 应用程序中,可以使用变量而无需先定义。这是为什么?
- javascript - 尝试连接两个数组并在另一列中设置值
- android - 如何使用 USB 声卡在 Windows 10 上启用 android 模拟器声音?
- javascript - 在观看视频之前尝试锁定注册
- python - 执行“nosetests cvxpy”MacOS 时出现“logsumexp”错误
- javascript - 在 WebSocket 事件上通过代理对象更新 Vue 数据
- c++ - BLE api将负温度转换为正温度