我正在使用http://www.cis.upenn.edu/~jshi/software/Ncut_9.zip中的规范化剪切包 (在Windows 7上)
这曾经与Matlab2010a一起使用.但是我已升级到Matlab2013a(32位学生版),现在我收到以下错误:
Error using arpackc
Expect 2 output arguments
Error in eigs_new (line 240)
arpackc( aupdfun, ido, ...
Error in ncut (line 83)
[vbar,s,convergence] =
eigs_new(@mex_w_times_x_symmetric,size(P,1),nbEigenValues,'LA',options,tril(P));
Error in ncutW (line 9)
[NcutEigenvectors,NcutEigenvalues] =
ncut(W,nbcluster);
Error in NcutImage (line 18)
[NcutDiscrete,NcutEigenvectors,NcutEigenvalues]
= ncutW(W,nbSegments);
Error in demoNcutImage (line 25)
[SegLabel,NcutDiscrete,NcutEigenvectors,NcutEigenvalues,W,imageEdges]=
NcutImage(I,nbSegments);
Run Code Online (Sandbox Code Playgroud)
显然,该new_eigs()函数ncuts与最新的Matlab中的ARPACK版本不兼容.
eigs()函数的修改版本.为什么我不能只使用Matlab的内置eigs()而不是eigs_new()(它似乎工作).matlab cluster-analysis image-processing image-segmentation arpack
我需要在 C++ 程序中计算一个非常大的稀疏对称矩阵的 n 个最小幅度特征向量。对于我的示例,假设 n=30 并且矩阵是 10k x 10k,其中大约有 70k 个非零值。
在对一些库进行大量研究和试验后,我发现 ARPACK++ 可能是我最好的选择,我按照本页中的步骤安装了它。
使用以下代码段进行计算:
// L is an Eigen library matrix
L.makeCompressed();
ARluSymMatrix<MTYPE> A(L.cols(), L.nonZeros(), L.valuePtr(), L.innerIndexPtr(), L.outerIndexPtr(), 'U');
ARluSymStdEig<MTYPE> eig(n, A, "SM");
TIC
eig.FindEigenvectors();
TOC
Run Code Online (Sandbox Code Playgroud)
这让我得到了正确的结果,但需要大约 8.5 秒,而在 Matlab 中,我只需通过调用即可在大约 0.5 秒内获得相同的结果
tic
[V,D] = eigs(L,30,'sm');
toc
Run Code Online (Sandbox Code Playgroud)
根据我对 Matlab 主题的研究,eigs()还为相同的计算调用了 ARPACK fortran 库,所以我不明白为什么 C++ 包装器如此之慢。
此外,ARPACK++ 在许多情况下的行为非常奇怪,例如当我尝试使用浮点数而不是双精度数时,程序将简单地停止并且什么都不做,直到我将其取下,或者当尝试计算 0 或 0.0001 等值附近的特征向量时,这应该相当于'SM',它只是吐出垃圾并崩溃。
因此,我怀疑 ARPACK++ 是否真的那么慢,或者所有这些都是一些错误配置/安装的症状,如果是这样,我可以做些什么来解决它。感谢您的任何帮助,您可以提供。
我正在使用scipy在一些大数据上做稀疏矩阵svd.matix大小约为200,000*8,000,000,非零条目为1.19%.我使用的机器有160G内存,所以我想内存应该不是问题.
所以这里是我使用的一些代码:
from scipy import *
from scipy.sparse import *
import scipy.sparse.linalg as slin
from numpy import *
K=1500
coom=coo_matrix((value,(row,col)),shape=(M,N))
coom=coom.astype('float32')
u,s,v=slin.svds(coom,K,ncv=8*K)
Run Code Online (Sandbox Code Playgroud)
错误消息如下:
Traceback (most recent call last):
File "sparse_svd.py", line 35, in <module>
u,s,v=slin.svds(coom,K,ncv=2*K+1)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/eigen/arpack/arpack.py", line 731, in svds
eigvals, eigvec = eigensolver(XH_X, k=k, tol=tol**2)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/eigen/arpack/arpack.py", line 680, in eigsh
params.iterate()
File "/usr/lib/python2.7/dist-packages/scipy/sparse/linalg/eigen/arpack/arpack.py", line 278, in iterate
raise ArpackError(self.info)
scipy.sparse.linalg.eigen.arpack.arpack.ArpackError: ARPACK error 3: No shifts could be applied during a cycle of the Implicitly restarted Arnoldi iteration. …Run Code Online (Sandbox Code Playgroud) 我想获得稀疏对称矩阵的特征向量,在给定时间内具有最佳精度。
目前我使用以下内容scipy.sparse.eigsh:
evals, evecs = eigsh(MyMatrix, 2,which='LM' ,tol=1.e-15, maxiter=1000000)
Run Code Online (Sandbox Code Playgroud)
如果它没有tol通过迭代收敛到精度maxiter,则会产生一个ArpackNoConvergence错误,其中包含已收敛的特征向量/值,但不包含未收敛的特征向量/值。然而,我更喜欢拥有精确的向量,1.e-14而1.e-15不是根本没有向量。有没有办法强制返回尚未收敛的特征向量(也许使用另一个库)?
就像在 Matlab 中一样,eigs函数无论如何都会返回特征向量,如果未达到所需的精度,则只会发出额外的警告。
谢谢 !