eigen - 使用混合行主要/列主要稀疏矩阵时在 Eigen 中崩溃
问题描述
尝试执行以下操作时,我在 Eigen 3.3.5 中遇到了崩溃:
Eigen::Map<Eigen::Matrix<float, 1, Eigen::Dynamic, Eigen::RowMajor>> eigenValues(valueBuffer, 1, 100000);
Eigen::Map<Eigen::Matrix<float, 1, Eigen::Dynamic, Eigen::RowMajor>> eigenChannels(channelBuffer, 1, 5000);
Eigen::SparseMatrix<float, Eigen::RowMajor> sparseChannels = eigenChannels.sparseView(1.0f, 1.e-4f);
Eigen::Map<const Eigen::SparseMatrix<float>> eigenLargeSparseMatrix(5000, 100000, LargeSparseMatrix.Values.Num(), LargeSparseMatrix.OuterStarts.GetData(), LargeSparseMatrix.InnerIndices.GetData(), LargeSparseMatrix.Values.GetData());
eigenValues += (sparseChannels * eigenLargeSparseMatrix);
具体来说,当试图获取 lhsIt 的索引时,它会在内部循环中的 Eigen::internal::sparse_sparse_to_dense_product_impl 中崩溃。
假设我已经检查过所有东西的大小都是正确的,我所有的缓冲区都用真实内存正确初始化,等等。我已经检查了这几天的每一个细节,试图在我的推理中找到一个错误或逻辑。
基本上我想做的就是:
1xn 行向量 += (1xm 行向量 * mxn 矩阵)
其中左侧是密集的,右侧向量/矩阵都是稀疏的。
查看模板化调用堆栈似乎正在发生的事情是 add_assign_op 正确识别行向量具有 RowMajor 标志并且矩阵是 ColMajor,但是随后 sparse_sparse_to_dense_product_impl 的 lhs 和 rhs 都是 ColMajor。
从 sparse_sparse_to_dense_product_selector 代码来看,这似乎是因为 Eigen 只是将 RowMajor lhs 更改为 ColMajorLhs 并调用产品 impl。这似乎必然会崩溃——它是一个行向量是有原因的,我不确定为什么 eigen 发现需要转置它。我真的不确定这是如何工作的。
我的挑战是我需要(为了内存流效率),在内存中按顺序组织更大的矩阵,以便a)它是 col 主要的,并且被一个行向量预乘,或者 b)它是行主要的并且被后乘由 col 向量。两个版本都使用了这个奇怪的转置代码,而不是让它们不同。
任何人都可以伸出援助之手吗?难道我做错了什么?这是一个错误吗?
补充:我有理由确定在这一点上崩溃是我自己的错,但我仍然想了解为什么行向量在乘法之前被转置,因为我认为这会产生不良行为。基本上在这一点上,我只想了解为什么 sparse_sparse_to_dense_product_selector 在乘法之前将行向量转置为列向量。
解决方案
推荐阅读
- c# - 使用持久 ID 的 C# 将 XML 数据加载到现有数据库中
- javascript - Javascript映射两个对象数组
- mysql - MySQL 服务器已消失 + 读取结果集标头时出错
- leaflet - 传单控件上不显示 img
- azure - Azure 应用程序网关:502 / SNI/SSL 问题?使用应用服务进行配置
- excel - 我可以将 VBA 中的计算值添加到单元格的悬停鼠标悬停中吗?
- mongodb - 我在 mongoDB 中有如下记录。需要查询以使用 startTime 获取前一天的结果
- java - `distinctUntilChanged`如何在调用onNext后允许相同的项目
- alexa-skills-kit - Alexa SDK V2 StateHandler - 多个意图共享相同的槽值
- asp.net-mvc - 升级 umbraco 后未从 bundle.cs 加载 Js 和 css 文件(返回 404)