特征实际上扩展了稀疏矩阵

Eigen virtually extend sparse matrix

本文关键字:实际上 扩展 特征      更新时间:2023-10-16

我有一个大小为 2N*N 的密集矩阵 A,必须乘以大小为 N*2N 的矩阵 B。

矩阵 B 实际上是 2 个稀疏矩阵 X 和 Y 的水平串联,B 只需要只读访问权限。

不幸的是,对我来说,稀疏矩阵似乎没有连接操作。当然,我可以简单地创建一个大小为 N*2N 的矩阵并用数据填充它,但这似乎相当浪费。似乎有一种方法可以将 X 和 Y 分组到某种矩阵视图中。

在我的例子中,额外的简化是 X 或 Y 是零矩阵。

对于您的具体情况,将 A 乘以 X 或 Y 就足够了 - 具体取决于哪个是非零的。结果将与乘以 B(简单矩阵代数(完全相同。

如果你的结果矩阵是列主矩阵(默认值(,你可以像这样将部分结果分配给垂直子块(如果XY在结构上为零,则相应的子乘积以 O(1( 计算(:

typedef Eigen::SparseMatrix<float> SM;
void foo(SM& out, SM const& A, SM const& X, SM const &Y)
{
assert(X.rows()==Y.rows() && X.rows()==A.cols());
out.resize(A.rows(), X.cols()+Y.cols());
out.leftCols(X.cols()) = A*X;
out.rightCols(Y.cols()) = A*Y;
}

如果你真的愿意,你可以写一个包装类,它包含对两个稀疏矩阵(XY(的引用并实现operator*(SparseMatrix, YourWrapper)- 但根据你如何使用它,最好进行显式函数调用。