Visual studio 2013 特征:稀疏矩阵乘法不产生修剪结果

Visual studio 2013 特征:稀疏矩阵乘法不产生修剪结果,visual-studio-2013,sparse-matrix,eigen,eigen3,Visual Studio 2013,Sparse Matrix,Eigen,Eigen3,我正在使用EIGEN进行稀疏矩阵优化和函数。一切都很好,除了在某些情况下,我无法理解这个情况 事情是这样的: Matrix A 2 0 0 0 2 0 0 0 2 Matrix B 6 3 0 1 2 8 Result 12 6 0 2 4 16 正如你所看到的,这是正确的结果,我总是得到正确的结果 问题在于被视为非零的值。在这种情况下: SparseMatrix<int, RowMajor> A; SparseMatrix<int, RowMajor> B;

我正在使用EIGEN进行稀疏矩阵优化和函数。一切都很好,除了在某些情况下,我无法理解这个情况

事情是这样的:

Matrix A
2 0 0
0 2 0
0 0 2

Matrix B
6 3
0 1
2 8

Result
12 6 
0 2 
4 16 
正如你所看到的,这是正确的结果,我总是得到正确的结果

问题在于被视为非零的值。在这种情况下:

SparseMatrix<int, RowMajor> A;
SparseMatrix<int, RowMajor> B;
//Parsing and initializing matrix
SparseMatrix<int, RowMajor> result = A*B;
result.pruned();
cout << result.nonZeros();
非零的结果是6。我不明白为什么,这是上可用的语法

现在最奇怪的是,在非常大的矩阵上,结果=A*B;result.pruned有时也会将0保存为非零,但比使用A*B.pruned时要少

我有三个问题:

为什么要删减result=A*B,而result=A*B;结果:修剪;给出关于非零值和无效结果的不同结果,这两种情况下哪个是正确的? 为什么产品中的零值有时不被视为零值? 你的成绩和我一样吗? 我正在使用Visual Studio Professional 2013和Egen 3.3.2,使用调试模式,目标是WIN32

谢谢你的帮助

编辑:VS2013稀疏乘法的基准,W32的调试/发布模式,带或不带SSE2指令集,两种情况下的结果相同;结果总是正确的,所以我不会把它粘贴在这里,它不会带来任何信息。与:

1=SparseMatrix resultA=A*B

2=SparseMatrix resultB=A*B;结果修剪

3=SparseMatrix resultC=A*B.修剪

案例1

期望值=5

1=5

2=5

3=6

案例2 矩阵太大,是文件吗

期望值=0

1=1444

2=1444

3=0

如您所见,根据输入和调用函数的方式,结果是否得到优化,1、2或3在任何情况下都不起作用


编辑²:问题已由ggael解决方案解决,谢谢。

我之前在下面的回答是错误的。问题解决了

这是因为您的目标是win32,因此您正在 FPU寄存器扩展精度的经典问题。通过 默认情况下,删减删除严格等于0的条目,但 有了FPU,非零可能只有在 正在从寄存器复制到内存中。更新编译器标志 以SSE2指令集为目标,或终止额外的FPU 精确性


我刚刚将编译器标志更改为SSE2指令集,并且仍然将0视为零值。你说杀死额外的FPU精度是什么意思?写一些像转换器的东西?我做了一个基准测试,根据结果,我不确定这是否是一个精度问题,因为根据调用函数的顺序,结果是不同的。我将在第一篇文章中添加这一点。你是对的。3.3和devel分支中修复的问题。
SparseMatrix<int, RowMajor> A;
SparseMatrix<int, RowMajor> B;
//Parsing and initializing matrix
SparseMatrix<int, RowMajor> result = (A*B).pruned();
cout << result.nonZeros();
Matrix A
2 0 0
0 2 0
0 0 2

Matrix B
5 3
0 1
2 8