gpt4 book ai didi

c++来自无拷贝的密集 vector 的特征 block 对角矩阵

转载 作者:太空宇宙 更新时间:2023-11-04 13:07:10 25 4
gpt4 key购买 nike

我有(密集且大的)行 vector v_1, ..., v_D,我需要矩阵 X 是 block 对角线(其第 i 个 block 是 v_i),以便执行矩阵乘积,如

X.transpose() * H.selfadjointView<Lower>() * X  

也就是说,X 应该是稀疏的,它的第 i 行是 v_i :

(pseudo code)
RowVectorXd v1(1,2,3), v2(4,5), v3(6,7,8,9);
SparseMatrix<double> X(3,9);

// I need X to be
X = 1 2 3 . . . . . .
. . . 4 5 . . . .
. . . . . 6 7 8 9

// where . means 0

编辑: 我的问题是:是否可以在不实际形成 X 或复制 v_i 的情况下做这个产品,而只是简单地使用对它们的引用?我关心的是性能和内存占用。

我认为解决方案与 Eigen::Map<...Stride...> 有关,但我无法理解。

非常感谢。

最佳答案

我最终找到了问题的答案。我把它贴在这里以防其他人需要它。对于矩阵 X 的这种特殊配置,我们可以直接形成

B = X^T * H * X

其中X和问题中的H是对称的,没有显式地形成X。由于X^T H X是对称的,我们只需要形成下对角线并使用

B.selfadjointView<Lower>() 

调用B。

注意X^T H X等价于H ** W,其中W为以下分块为的下三角矩阵

W = v_1^T * v_1
v_2^T * v_1 v_2^T * v_2
. . v_3^T * v_3
. . . ...
. . . ...
v_D^T * v_1 v_D^T * v_2 v_D^T * v_3 ... v_D^T * v_D

and ** 是一个重载运算符,它计算 H 的 (i,j) 标量与 W 中的 block (i,j) 之间的分量乘积。所以

B = H ** (v^T * v) 

关于c++来自无拷贝的密集 vector 的特征 block 对角矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41683723/

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