为什么Mathematica计算矩阵特征值这么慢?
mathematica吧
全部回复
仅看楼主
level 1
gotiesuoqiao6 楼主
就是简单的读入以空格间隔的7000行7000列的全是1或0的csv文件到一个矩阵,然后计算最大特征值对应的特征向量
在计算特征向量的时候,CPU占用100%达到两个小时,其他程序都没法运行了,仍然不出结果,只好杀掉进程。
用了10.3, 10.3.1, 都一样
同样的数据,同样的命令,我用Julia一分钟出结果,
用Python也就几分钟就出结果,
用C# + 免费的alglib慢,一个小时出结果,但CPU占用很低
Mathematica命令:
t1=Import["E:/importance_table.csv","Table"];
Dimensions[t1];
{val, vec}=Eigensystem[t1 ,1];
Export["E:/112.txt",Transpose[vec],"Table"];
2016年01月02日 15点01分 1
吧务
level 15
没数据你说个××——虽然本想这么说,不过目测只要在Import前面加个N@ 就没事了。
2016年01月02日 15点01分 2
吧务
level 15
保险起见自己算了下:
2016年01月02日 15点01分 3
吧务
level 12
实际上还可以更快
In[1]:= mat =
With[{n = 7000}, N@RandomInteger[{0, 1}, {n, n}]]; {{val}, {vec}} =
Eigensystem[mat, 1, Method -> "Arnoldi"]; // AbsoluteTiming
mat.vec - val*vec // Abs // Max
Out[1]= {1.010029, Null}
Out[2]= 1.77636*10^-13
因为你只求最大特征值,所以可以用Arnoldi,在我电脑上比直接算快大概300倍,而且精度也还在接受范围之内
2016年01月03日 03点01分 5
有没有什么方法可以只算按模最小的若干个特征值的?
2016年01月03日 08点01分
@筆調零亂 可以直接Eigenvalues[mat, -1, Method -> "Arnoldi"],也可以1/Eigenvalues[Inverse[mat], 1, Method -> "Arnoldi"],第二个还更快一点。1可以换成任意数,具体的你可以看下Eigenvalues帮助里的讲解
2016年01月03日 08点01分
2016年01月03日 08点01分
回复@无影东瓜 :多谢!
2016年01月03日 08点01分
level 1
gotiesuoqiao6 楼主
太棒了,谢谢二位
In[19]:=
{val, vec} = Eigensystem[t1 , 1]; // AbsoluteTiming
{val2, vec2} =
Eigensystem[t1 , 1, Method -> "Arnoldi"]; // AbsoluteTiming
Out[19]= {44.5429, Null}
Out[20]= {1.19347, Null}
2016年01月03日 14点01分 6
1