2015-02-05 13 views
5

Ich portiere etwas Matlab-Code, der rcond() verwendet, um auf Singularität zu testen, wie auch recommended here (für Matlab-Singularitätstest).Gibt es eine Entsprechung zu MATLABs Funktion rcond() in Julia?

Ich sehe, dass es eine cond() Funktion in Julia (wie auch in Matlab), aber rcond() erscheint nicht standardmäßig verfügbar zu sein:

ERROR: rcond not defined 

ich das rcond annehmen würde(), wie die Matlab-Version ist more efficient than 1/cond(). Gibt es in Julia eine solche Funktion, vielleicht mit einem Zusatzmodul?

Antwort

7

Julia calculates the condition number using the ratio of maximum to the minimum of the eigenvalues (bekamen Open Source zu lieben, nicht mehr MATLAB schwarz Boxs!)

Julia keine rcond Funktion in der Base, und ich bin von einem in jedem Paket nicht bewusst. Wenn es so wäre, wäre es nur das Verhältnis von Maximum zu Minimum. Ich bin nicht sicher, warum es in MATLAB effizient ist, aber es ist durchaus möglich, dass, was auch immer der Grund ist, es zu Julia nicht trägt.

+0

Ein Link zu der Implementierung in Ihrer Antwort ist sehr cool. Vielen Dank! Konnte Matlab's rcond die Berechnung aller singulären Werte vermeiden, vielleicht eine Schätzung von nur dem größten und kleinsten bekommen? –

+0

Matlab verwendet wahrscheinlich nur LAPACKs [dgecon.f] (http://www.netlib.org/lapack/double/dgecon.f), die in Julia ähnlich exponiert (und weiter für verschiedene Matrixtypen spezialisiert) werden könnten. –

+0

Ah, es ist [bereits verpackt] (https://github.com/JuliaLang/julia/blob/b33f5782d2b8d8c8bf569fb152af46dbf2e3ec29/base/linalg/lapack.jl#L3219-L3285) und in [einigen Fällen] (https: // github .com/JuliaLang/julia/blob/b33f5782d2b8d8c8bf569fb152af46dbf2e3ec29/base/linalg/lu.jl # L153). Es wäre wahrscheinlich gut, ein Benchmarking durchzuführen, um zu sehen, ob eine explizite Matlab-artige 'rcond' gerechtfertigt ist. –

2

Matlab rcond das ist eine Optimierung beruht auf der Tatsache, dass seine ein schätzen der Konditionszahl für Platz Matrizen. Bei meinen Tests und der Tatsache, dass seine Hilfe den 1-Norm-Schätzer von LAPACK erwähnt, scheint es, als ob es LAPACKs dgecon.f verwendet. In der Tat ist dies genau das, was Julia tut, wenn Sie nach der Zustandsnummer einer quadratischen Matrix mit der 1- oder Inf-Norm fragen.

So können Sie einfach

rcond(A::StridedMatrix) = 1/cond(A,1) 
definieren

Sie können Julia speichern von zweimal umkehr Ergebnisse LAPACK die durch die manuelle Kombination cond(::StridedMatrix) und cond(::LU), aber die Einsparungen hier wird mit ziemlicher Sicherheit unermesslich sein. Wo gibt es jedoch eine messbare Einsparungen, ist, dass Sie direkt die norm(A) nehmen können anstatt eine Matrix ähnlich zu A durch seine LU-Faktorisierung zu rekonstruieren.

rcond(A::StridedMatrix) = LAPACK.gecon!('1', lufact(A).factors, norm(A, 1)) 

In meinen Tests, verhält sich dies identisch mit Matlab rcond (2014b) und bietet eine anständige Beschleunigung.

Verwandte Themen