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

时间:2019-12-05 13:21:21

标签: c++ eigen

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

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

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

在我的情况下,其他简化是X或Y是零矩阵。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果结果矩阵为列主(默认),则可以将部分结果分配给垂直子块,例如(如果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),但取决于您的使用方式它,最好进行显式的函数调用。