特征实际上扩展了稀疏矩阵
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;
}
如果你真的愿意,你可以写一个包装类,它包含对两个稀疏矩阵(X
和Y
(的引用并实现operator*(SparseMatrix, YourWrapper)
- 但根据你如何使用它,最好进行显式函数调用。
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么我的删除节点函数实际上没有删除节点?
- C++中的VLA,扩展名为std=C++11
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 其中降频广播实际上是有用的
- C++返回 Numpy 数组的 Python 扩展模块
- 扩展可变参数模板中的变量名称
- 扩展C++生成的代码的模板参数类型名称
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- 将元组类型扩展为可变参数模板?
- 如何按文件扩展名引用文件夹中的文件
- HDF5Cpp 扩展复合数据集超板问题
- MSVC中的宏观扩展问题
- 特征实际上扩展了稀疏矩阵