繁体   English   中英

本征虚拟扩展稀疏矩阵

[英]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(简单矩阵代数)完全相同。

如果您的结果矩阵是列主要(默认),您可以像这样将部分结果分配给垂直子块(如果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) —— 但取决于您如何使用它,最好制作一个显式函数调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM