本征虚拟扩展稀疏矩阵
Eigen virtually extend sparse matrix
我有一个大小为 2N*N 的密集矩阵 A,它必须乘以大小为 N*2N 的矩阵 B。
矩阵 B 实际上是 2 个稀疏矩阵 X 和 Y 的水平串联。B 只需要只读访问。
对我来说不幸的是,稀疏矩阵似乎没有串联操作。当然,我可以简单地创建一个大小为 N*2N 的矩阵并用数据填充它,但这似乎相当浪费。似乎有一种方法可以将 X 和 Y 分组到某种矩阵视图中。
在我的例子中,额外的简化是 X 或 Y 是零矩阵。
对于您的具体情况,将 A 乘以 X 或 Y 就足够了 - 取决于哪个非零。结果将与乘以 B(简单矩阵代数)完全相同。
如果您的结果矩阵是主要列(默认),您可以像这样将部分结果分配给垂直子块(如果 X
或 Y
在结构上为零,则相应的子-产品在 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;
}
如果你真的想要,你可以编写一个包装器 class 来保存对两个稀疏矩阵(X
和 Y
)的引用并实现 operator*(SparseMatrix, YourWrapper)
--但根据您的使用方式,进行显式函数调用可能更好。
我有一个大小为 2N*N 的密集矩阵 A,它必须乘以大小为 N*2N 的矩阵 B。
矩阵 B 实际上是 2 个稀疏矩阵 X 和 Y 的水平串联。B 只需要只读访问。
对我来说不幸的是,稀疏矩阵似乎没有串联操作。当然,我可以简单地创建一个大小为 N*2N 的矩阵并用数据填充它,但这似乎相当浪费。似乎有一种方法可以将 X 和 Y 分组到某种矩阵视图中。
在我的例子中,额外的简化是 X 或 Y 是零矩阵。
对于您的具体情况,将 A 乘以 X 或 Y 就足够了 - 取决于哪个非零。结果将与乘以 B(简单矩阵代数)完全相同。
如果您的结果矩阵是主要列(默认),您可以像这样将部分结果分配给垂直子块(如果 X
或 Y
在结构上为零,则相应的子-产品在 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;
}
如果你真的想要,你可以编写一个包装器 class 来保存对两个稀疏矩阵(X
和 Y
)的引用并实现 operator*(SparseMatrix, YourWrapper)
--但根据您的使用方式,进行显式函数调用可能更好。