7

używam pakiet cięć znormalizowane od http://www.cis.upenn.edu/~jshi/software/Ncut_9.zip (Windows 7)Znormalizowane kawałki z Matlab 2013a

Ten pracował dobrze z Matlab2010a. Jednak mam zaktualizowany do Matlab2013a (32 bitowa wersja student) i teraz pojawia się następujący błąd:

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); 

Oczywiście funkcja w ncutsnew_eigs() jest niezgodna z wersją ARPACK w najnowszej Matlab.

  • Czy ktoś wie o obejściu tego problemu?
  • Normalized używa zmodyfikowanej wersji funkcji Matlaba: eigs(). Dlaczego nie mogę po prostu użyć wbudowanego programu Matlab eigs() zamiast eigs_new() (wydaje się, że działa).
+0

czy możesz wyjaśnić, dlaczego 'eigs()' nie działa dla ciebie? – Shai

Odpowiedz

7

Istnieją dwa rozwiązania to: eigs() funkcja

  1. Skorzystaj Matlaba zamiast eigs_new() dostarczane w znormalizowanych cięć pakiet. Domyślam się, że eigs_new() został zaprojektowany, aby rozwiązać problem ze zgodnością z poprzednią wersją Matlaba i sam w sobie powoduje problem. Zmodyfikuj . Tam, gdzie jest połączenie z arpackc() w eigs_new(), wykonaj wywołanie jak w wersji skrzynki narzędziowej o numerze eigs(). Więc np

    arpackc(aupdfun, ido, ... 
    bmat, intconvert(n), whch, nev, tol, resid, ncv, ... 
        v, ldv, iparam, ipntr, workd, workl, lworkl, info); 
    

staje

[ido, info] = arpackc(aupdfun, ido, bmat, intconvert(n), whch, ... 
     nev, tol, resid, ncv, v, ldv, iparam, ipntr, workd, workl, ... 
     lworkl, info); 

Były tylko dwa miejsca, gdzie ten musiał zostać zmieniony, aby to działało (choć istnieją inne połączenia do arpackc() które w rzeczywistości nie zostać wykonanym).

Nadal nie jestem pewien, dlaczego w ogóle istnieje eigs_new().

+0

Pierwsze rozwiązanie zadziałało jak czar! Dzięki :) – Sadjad

0

Kiedyś pracowałem z tym kodem jakiś czas temu. W przypadku problemów 32-64-bitowych wprowadziłem pewne zmiany. Zmieniłem również ten eigs_new linię do

[vbar,s,convergence] = eigs2(@mex_w_times_x_symmetric,size(P,1),nbEigenValues,'LA',options,tril(P)); 

powinno działać ...

+0

W mojej wersji Matlaba nie ma eigs2(), więc to niestety nie pomaga. – Bull

+0

@ user2151446 wypróbuj http://www.oifii.org/ns-org/nsd/ar/cp/music_marsyas-0.4.5/marsyas-0.4/marsyas-0.4.5/scripts/MATLAB/peakExtraction/ncut/eigs2. m – Shai

+0

Dzięki, jednak ta wersja eigs2() ma taką samą niekompatybilność z arpackc() w Matlab2013a jak eigs_new() – Bull

5

W matlab2014a Windows 64-bitowych, zmienić tylko

[vbar,s,convergence] = eigs_new(@mex_w_times_x_symmetric,size(P,1),nbEigenValues,'LA',options,tril(P)); 

w wierszu 81 ncut.m do

[vbar,s,convergence] = eigs(@mex_w_times_x_symmetric,size(P,1),nbEigenValues,'LA',options,tril(P)); 

a następnie eigs_new.m jest bezużyteczny, który nie obchodzi. Becaus w 2014 (lub więcej niż 2009) arpackc został zastąpiony przez eigs. Możesz przeczytać pomoc eigów, aby uzyskać dodatkową pomoc.