Frage

Ich möchte das System der linearen Gleichungen lösen:

 Ax = b

A ist a n x m Matrix (nicht quadratisch), B und X sind beide n x 1 Vektoren. Wo A und B bekannt sind, stammt N aus der Größenordnung von 50-100 und M ist ungefähr 2 (mit anderen Worten, A könnte maximal [100x2] sein).

Ich kenne die Lösung von x: $x = \inv(A^T A) A^T b$

Ich habe einige Möglichkeiten gefunden, es zu lösen: UBLAs (Boost), Lapack, Eigen und usw. Aber ich weiß nicht, wie schnell die CPU -Berechnungszeit von 'x' mit diesen Paketen ist. Ich weiß auch nicht, ob dies numerisch schnell ist, warum ich 'x' lösen soll '

Was für mich wichtig ist, ist, dass die CPU -Berechnungszeit kurz wie möglich ist und eine gute Dokumentation, da ich Neuling bin.

Nach der Lösung der normalen Gleichung Ax = b Ich möchte meine Annäherung mit regressiven und verbessern und verbessern vielleicht später Anwenden von Kalman -Filter.

Meine Frage ist, welche C ++ -Bibliothek der Robuster und schneller für die oben beschriebenen Bedürfnisse ist?

War es hilfreich?

Lösung

Dies ist eine Lösung für die kleinste Quadrate, da Sie mehr Unbekannte als Gleichungen haben. Wenn m tatsächlich gleich 2 ist, sagt mir das, dass ein einfacher linearer kleinster Quadrate für Sie ausreicht. Die Formeln können in geschlossener Form ausgeschrieben werden. Sie brauchen keine Bibliothek.

Wenn M einstellig ist, würde ich immer noch sagen, dass Sie dies mit einem (Transponieren)*a*x = a (transponieren)*b leicht lösen können. Eine einfache LU -Zerlegung, die für die Koeffizienten gelöst werden kann, wäre ausreichend. Es sollte ein viel einfacheres Problem sein, als Sie es schaffen.

Andere Tipps

UBLAs sind nicht optimiert, es sei denn, Sie verwenden es mit optimierten BLAS -Bindungen.

Das Folgende ist für Multi-Threading und SIMD optimiert:

  1. Intel MKL. FORTRAN -Bibliothek mit C -Schnittstelle. Nicht frei, aber sehr gut.
  2. Eigen. True C ++ Bibliothek. Frei und Open Source. Einfach zu bedienen und gut.
  3. Atlas. Forran und C. Free und Open Source. Nicht Fensterfreundlichkeit, aber ansonsten gut.

Übrigens, ich weiß nicht genau, was Sie tun, aber in der Regel sind normale Gleichungen keine richtige Möglichkeit, eine lineare Regression zu machen. Wenn Ihre Matrix nicht gut konditioniert ist, sollte QR oder SVD bevorzugt werden.

Wenn die Lizcence kein Problem darstellt, können Sie die GNU Scientific Library ausprobieren

http://www.gnu.org/software/gsl/

Es wird mit einer BLAS -Bibliothek geliefert, die Sie für eine optimierte Bibliothek tauschen können, wenn Sie später (zum Beispiel die Intel-, Atlas- oder ACML -Bibliothek (AMD -Chip) benötigen.

Wenn Sie Zugriff auf MATLAB haben, würde ich empfehlen, die C -Bibliotheken zu verwenden.

Wenn Sie sich wirklich spezialisieren müssen, können Sie die Matrixinversion (auf willkürliche Genauigkeit) mit der Skilling -Methode annähern. Es verwendet nur Orden (n^2) Operationen (anstelle der Reihenfolge n^3 der üblichen Matrixinversion - lu -Zersetzung usw.).

Es wird in der These von Gibbs beschrieben, die hier verknüpft sind (um Seite 27):

http://www.inference.phy.cam.ac.uk/mng10/gp/thesis.ps.gz

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top