来自密集向量的 c++ 特征块对角矩阵,无需复制
c++ Eigen block diagonal matrix from dense vectors without copy
我有(密集和大的)行向量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<...跨步...>但我无法理解。
非常感谢。
我最终找到了问题的答案。我把它贴在这里,以防其他人需要它。对于矩阵 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)
相关文章:
- 将指向给定子类的指针从一个向量复制到另一个向量
- 为共享 ptr 向量实现复制 c'tor?
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 具有 STL 向量类型成员的类的复制内存
- 将字符向量复制到另一个向量
- 如何从字符串向量构造对象并避免复制?
- 在 Cython 中将C++向量转换为 numpy 数组,而无需复制
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 将shared_ptr的向量复制到抽象基的派生类
- 如何避免将向量的完整值复制到另一个容器
- C++向量的哪一部分在传递给函数时被复制
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 如何将 int4 数组复制到 int8 向量中
- 复制向量本身
- 在 C++11 中高效复制向量
- 复制向量为成员变量的对象的构造函数
- 不复制向量类成员
- 在不使用元素复制赋值运算符的情况下复制向量 - 可移植性
- 在复制构造函数中复制向量的向量
- 从常量变量复制向量