C++ 特征值虚拟扩展稀疏矩阵
我有一个大小为2N*N的稠密矩阵a,它必须乘以大小为N*2N的矩阵B 矩阵B实际上是两个稀疏矩阵X和Y的水平串联。B只需要只读访问 不幸的是,对于稀疏矩阵,似乎没有串联操作。当然,我可以简单地创建一个大小为N*2N的矩阵,并用数据填充它,但这似乎相当浪费。似乎有一种方法可以将X和Y组合成某种矩阵视图C++ 特征值虚拟扩展稀疏矩阵,c++,eigen,C++,Eigen,我有一个大小为2N*N的稠密矩阵a,它必须乘以大小为N*2N的矩阵B 矩阵B实际上是两个稀疏矩阵X和Y的水平串联。B只需要只读访问 不幸的是,对于稀疏矩阵,似乎没有串联操作。当然,我可以简单地创建一个大小为N*2N的矩阵,并用数据填充它,但这似乎相当浪费。似乎有一种方法可以将X和Y组合成某种矩阵视图 在我的例子中,额外的简化是X或Y是一个零矩阵 对于您的特定情况,将A乘以X或Y就足够了,这取决于哪个非零。结果将与B简单矩阵代数的乘法完全相同。对于您的特定情况,将A乘以X或Y就足够了,这取决于哪一
在我的例子中,额外的简化是X或Y是一个零矩阵 对于您的特定情况,将A乘以X或Y就足够了,这取决于哪个非零。结果将与B简单矩阵代数的乘法完全相同。对于您的特定情况,将A乘以X或Y就足够了,这取决于哪一个不是零。结果将与B简单矩阵代数的乘法完全相同。如果结果矩阵为列主矩阵(默认值),则可以将部分结果分配给垂直子块,如下所示:如果X或Y在结构上为零,则相应的子积在O1中计算:
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的引用,并实现运算符*SparseMatrix,您的包装器-但根据您使用它的方式,可能最好进行显式函数调用。如果您的结果矩阵是默认值,您可以将部分结果指定给垂直子块,如下所示:如果X或Y在结构上为零,则相应的子积在O1中计算:
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的引用,并实现操作符*SparseMatrix,你的包装器-但根据你如何使用它,可能最好是进行显式函数调用。你说得对,没有注意到这一点。然而,我仍然对一般情况感到好奇。你是对的,没有注意到这一点。但是,我仍然对一般情况感到好奇。顺便说一句:您可能希望遵循此功能请求:顺便说一句:您可能希望遵循此功能请求: