c ++来自密集向量的特征块对角矩阵,无副本

时间:2017-01-16 19:28:41

标签: c++ reference sparse-matrix eigen

我有(密集和大)行向量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;有关。但我无法得到它。

非常感谢。

1 个答案:

答案 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)