Visual studio 2013 特征:稀疏矩阵乘法不产生修剪结果
我正在使用EIGEN进行稀疏矩阵优化和函数。一切都很好,除了在某些情况下,我无法理解这个情况 事情是这样的: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;
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