首页 > 解决方案 > 使用混合行主要/列主要稀疏矩阵时在 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 在乘法之前将行向量转置为列向量。

标签: eigen

解决方案


推荐阅读