使用混合行主/ col主稀疏矩阵时,Eigen崩溃

问题描述 投票:0回答:1

尝试执行以下操作时,我在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。这似乎注定要崩溃-由于某种原因,它是行向量,我不确定为什么本征会发现需要对其进行转置。我真的不确定这意味着什么。

我的挑战是(为了提高内存的流传输效率,我需要在内存中按顺序组织较大的矩阵,以便a)它是col major,并预先乘以一个行向量,或者b)它是row major并且被发布乘以col向量。这两个版本都击中了这个奇怪的转置代码,而不仅仅是让它们有所不同。

任何人都可以伸出援手吗?难道我做错了什么?这是一个错误吗?

eigen
1个回答
0
投票

我最终通过编写自己的产品代码版本来解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.