我有(密集和大)行向量v_1,...,v_D,我需要矩阵X作为块对角线(其第i个块是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&lt; ... Stride ...&gt;有关。但我无法得到它。
非常感谢。
答案 0 :(得分:0)
我最终找到了我的问题的答案。我在这里张贴以防万一其他人需要它。对于矩阵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
和**是一个重载运算符,它计算H的(i,j)标量和W中的块(i,j)之间的分量乘积。所以
B = H ** (v^T * v)