我有一个大小为2N * N的密集矩阵A,必须与大小为N * 2N的矩阵B相乘。
矩阵B实际上是两个稀疏矩阵X和Y的水平串联。B仅需要只读访问权限。
不幸的是,对于稀疏矩阵似乎没有连接操作。当然,我可以简单地创建一个大小为N * 2N的矩阵,并用数据填充它,但这似乎很浪费。似乎有一种方法可以将X和Y分组为某种矩阵视图。
在我的情况下,其他简化是X或Y是零矩阵。
答案 0 :(得分:2)
对于您的特定情况,将A乘以X或Y就足够了-取决于哪一个非零。结果将与乘以B(简单矩阵代数)的结果完全相同。
答案 1 :(得分:1)
如果结果矩阵为列主(默认),则可以将部分结果分配给垂直子块,例如(如果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;
}
如果确实需要,您可以编写一个包装器类,其中包含对两个稀疏矩阵(X
和Y
)的引用,并实现operator*(SparseMatrix, YourWrapper)
,但取决于您的使用方式它,最好进行显式的函数调用。