Was sind die am häufigsten verwendeten C ++ - Vektor- / Matrix-Mathematik- / Linearalgebra-Bibliotheken und ihre Kosten- und Nutzen-Kompromisse? [geschlossen]

242

Es scheint, dass viele Projekte langsam auf die Notwendigkeit stoßen, Matrixmathematik zu betreiben, und in die Falle geraten, zuerst einige Vektorklassen zu erstellen und langsam Funktionen hinzuzufügen, bis sie beim Aufbau einer halbherzigen benutzerdefinierten linearen Algebra-Bibliothek erwischt werden, und dies hängt davon ab.

Ich möchte dies vermeiden, ohne eine Abhängigkeit von einer tangential verwandten Bibliothek (z. B. OpenCV, OpenSceneGraph) aufzubauen.

Was sind die am häufigsten verwendeten Bibliotheken für Matrixmathematik / lineare Algebra und warum sollte man sich entscheiden, eine übereinander zu verwenden? Gibt es welche, von denen aus irgendeinem Grund abgeraten wird? Ich verwende dies speziell in einem geometrischen / zeitlichen Kontext * (2,3,4 Dim) *, verwende aber möglicherweise in Zukunft höherdimensionale Daten.

Ich suche nach Unterschieden in Bezug auf: API, Geschwindigkeit, Speichernutzung, Breite / Vollständigkeit, Enge / Spezifität, Erweiterbarkeit und / oder Reife / Stabilität.

Aktualisieren

Am Ende habe ich Eigen3 verwendet, mit dem ich sehr zufrieden bin.

Catskul
quelle
2
Da Sie OSG und OpenCV erwähnt haben, benötigen Sie vermutlich nur Vektor / Matrizen vom Typ 3D-Grafiken, dh 3x3- und 4x4-Matrizen. Ich habe meine Antwort darauf gestützt, aber Sie möchten vielleicht angeben, wie genau Sie dies verwenden - benötigen Sie eine Matrixlösung? Höherdimensionale Matrixmathematik? usw.
Reed Copsey
Im Moment mache ich nur auf 2D-Geometrie basierende Dinge, aber hypothetisch benötigen Sie manchmal 3x3-Operationen für 2D-Daten, und es ist unklar, ob 3D-Daten und damit 4x4-Operationen erforderlich sein könnten. Wir möchten eine gemeinsame Bibliothek im gesamten Unternehmen verwenden. Ich habe kein gutes Gespür dafür, wie der Kompromiss aussehen würde. Allgemeiner wäre besser, aber zu welchem ​​Preis ist die Frage.
Catskul
1
Wenn Sie nur geometrische Transformationen durchführen, würde ich wirklich empfehlen, sich GGT anzusehen, wie ich in meiner Antwort erwähnt habe. Es ist sehr vollständig dafür, aber es tut wirklich nichts, ABER das, also ist es eine sehr saubere, einfache Option. BLAS und LAPACK eignen sich eher für doign komplexe Matrixlösungen (dh 50x50-Matrizen, spärliche Matrizen usw.) für Wissenschaft und Mathematik, nicht für geometrische Transformationen.
Reed Copsey

Antworten:

114

Es gibt einige Projekte, die sich dafür für das Generic Graphics Toolkit entschieden haben. Das GMTL dort ist nett - es ist ziemlich klein, sehr funktional und wurde weit genug verwendet, um sehr zuverlässig zu sein. OpenSG, VRJuggler und andere Projekte haben alle darauf umgestellt, dies anstelle ihrer eigenen handgerollten Vertor / Matrix-Mathematik zu verwenden.

Ich fand es sehr schön - es erledigt alles über Vorlagen, ist also sehr flexibel und sehr schnell.


Bearbeiten:

Nach der Diskussion der Kommentare und den Änderungen dachte ich, ich würde mehr Informationen über die Vor- und Nachteile bestimmter Implementierungen herausgeben und darüber, warum Sie in Anbetracht Ihrer Situation eine über die andere wählen könnten.

GMTL -

Vorteile: Einfache API, speziell für Grafik-Engines entwickelt. Enthält viele primitive Typen, die auf das Rendern ausgerichtet sind (z. B. Ebenen, AABB, Quatenrionen mit Mehrfachinterpolation usw.), die in keinem anderen Paket enthalten sind. Sehr geringer Speicheraufwand, recht schnell und einfach zu bedienen.

Nachteile: Die API konzentriert sich speziell auf Rendering und Grafiken. Enthält keine NxM-Matrizen (General Purpose), Matrixzerlegung und -lösung usw., da diese außerhalb des Bereichs traditioneller Grafik- / Geometrieanwendungen liegen.

Eigen -

Leistungen: Saubere API , ziemlich einfach zu bedienen. Enthält ein Geometriemodul mit Quaternionen und geometrischen Transformationen. Geringer Speicheraufwand. Vollständige, hochleistungsfähige Lösung großer NxN-Matrizen und anderer universeller mathematischer Routinen.

Nachteile: Möglicherweise etwas größer als Sie möchten (?). Weniger geometrische / renderspezifische Routinen im Vergleich zu GMTL (dh: Euler-Winkeldefinitionen usw.).

IMSL -

Vorteile: Sehr vollständige numerische Bibliothek. Sehr, sehr schnell (angeblich der schnellste Löser). Mit Abstand die größte und vollständigste mathematische API. Kommerziell unterstützt, ausgereift und stabil.

Nachteile: Kosten - nicht billig. Es gibt nur sehr wenige geometrische / renderspezifische Methoden, daher müssen Sie Ihre eigenen über die linearen Algebra-Klassen rollen.

NT2 -

Vorteile: Bietet eine Syntax, die vertrauter ist, wenn Sie an MATLAB gewöhnt sind. Bietet vollständige Zerlegung und Lösung für große Matrizen usw.

Nachteile: Mathematisch, nicht fokussiert. Wahrscheinlich nicht so performant wie Eigen.

LAPACK -

Vorteile: Sehr stabile, bewährte Algorithmen. Schon lange da. Vollständige Matrixlösung usw. Viele Optionen für obskure Mathematik.

Nachteile: In einigen Fällen nicht so leistungsfähig. Portiert von Fortran mit ungerader API zur Verwendung.

Für mich persönlich kommt es auf eine einzige Frage an: Wie wollen Sie diese nutzen? Wenn Sie sich nur auf Rendering und Grafiken konzentrieren, gefällt mir das Generic Graphics Toolkit , da es eine gute Leistung erbringt und viele nützliche Rendering-Vorgänge sofort unterstützt, ohne dass Sie Ihre eigenen implementieren müssen. Wenn Sie eine universelle Matrixlösung benötigen (dh SVD- oder LU-Zerlegung großer Matrizen), würde ich mich für Eigen entscheiden , da es dies handhabt, einige geometrische Operationen bereitstellt und bei großen Matrixlösungen sehr performant ist. Möglicherweise müssen Sie mehr eigene Grafiken / geometrische Operationen (über deren Matrizen / Vektoren) schreiben, aber das ist nicht schrecklich.

Reed Copsey
quelle
Haben Sie andere Bibliotheken evaluiert, bevor Sie sich für GMTL entschieden haben? Ein oberflächlicher Vergleich ließ mich glauben, dass Eigen besser unterstützt wurde, aber das basiert auf der Überprüfung der jeweiligen Websites. Kennen Sie die spezifischen Vorteile des einen gegenüber dem anderen?
Catskul
Eigen funktioniert auch gut. Es war zu dem Zeitpunkt, als ich meine Untersuchung durchführte, noch nicht so ausgereift, aber ich glaube, dass dies zu diesem Zeitpunkt eine gute Option wäre. GMTL wurde ziemlich häufig verwendet und war sehr ausgereift und solide, als ich mich entschied, es zu verwenden.
Reed Copsey
Ich denke, ich möchte meine Frage auf den Kern reduzieren: Haben Sie Ihre Wahl subjektiv wie "Das sieht besser aus" getroffen oder wo es bestimmte Merkmale (API, Geschwindigkeit, Speichernutzung, Breite, Enge, Erweiterbarkeit) gab, die den Unterschied ausmachten. Ich nehme an, die Laufzeit fällt unter dieses Kriterium, aber wenn die Laufzeit die einzige Metrik wäre, hätten Sie wahrscheinlich eine BLAS- oder LAPACK-basierte Option ausgewählt.
Catskul
Nachdem ich mehrere Optionen ausprobiert hatte, entschied ich mich dafür: Leistung, Benutzerfreundlichkeit und geringer Overhead für Laufzeit / Kompilierungszeit. Eigen sieht jetzt viel besser aus als zu diesem Zeitpunkt, daher kann ich nicht zwischen ihnen urteilen. Ich war jedoch sehr zufrieden mit GMTL für unsere Zwecke.
Reed Copsey
Das ist ein Teil dessen, warum ich GMTL mag und es benutzt habe. Es fühlte sich einfach sehr natürlich an und war sehr, sehr einfach zu handhaben. In diesem Fall wurde auch alles unterstützt, was ich brauchte, da ich mir nur Sorgen um die direkte Handhabung von geometrischen Transformationen und Quaternionsrotationen machte.
Reed Copsey
38

Ich bin also eine ziemlich kritische Person, und wenn ich in eine Bibliothek investieren will, sollte ich besser wissen, worauf ich mich einlasse. Ich denke, es ist besser, die Kritik ernst zu nehmen und die Schmeichelei bei der Prüfung zu beleuchten. Was daran falsch ist, hat viel mehr Auswirkungen auf die Zukunft als was richtig ist. Also werde ich hier ein wenig über Bord gehen, um die Antwort zu geben, die mir geholfen hätte, und ich hoffe, dass ich anderen helfen kann, die diesen Weg gehen könnten. Denken Sie daran, dass dies auf den wenigen Überprüfungen / Tests basiert, die ich mit diesen Bibliotheken durchgeführt habe. Oh, und ich habe Reed einen Teil der positiven Beschreibung gestohlen.

Ich werde oben erwähnen, dass ich mich trotz seiner Eigenheiten für GMTL entschieden habe, weil die Eigen2-Unsicherheit nicht zu groß war. Aber ich habe kürzlich erfahren, dass die nächste Version von Eigen2 Definitionen enthält, die den Ausrichtungscode ausschalten und sicher machen. Also darf ich umschalten.

Update : Ich habe auf Eigen3 umgestellt. Trotz seiner Eigenheiten sind Umfang und Eleganz zu schwer zu ignorieren, und die Optimierungen, die es unsicher machen, können mit einer Definition deaktiviert werden.

Eigen2 / Eigen3

Vorteile: LGPL MPL2, saubere, gut gestaltete API, ziemlich einfach zu bedienen. Scheint mit einer lebendigen Community gut gepflegt zu sein. Geringer Speicheraufwand. Hochleistung. Gemacht für die allgemeine lineare Algebra, aber auch für gute geometrische Funktionen. Alle Header lib, keine Verknüpfung erforderlich.

Idiocyncracies / Nachteile: (Einige / alle können durch einige Definitionen vermieden werden, die im aktuellen Entwicklungszweig Eigen3 verfügbar sind.)

  • Unsichere Leistungsoptimierungen führen dazu, dass die Regeln sorgfältig befolgt werden müssen. Die Nichtbeachtung von Regeln führt zu Abstürzen.
    • Sie können den Wert einfach nicht sicher übergeben
    • Die Verwendung von Eigen-Typen als Mitglieder erfordert eine spezielle Anpassung des Allokators (oder Sie stürzen ab).
    • Die Verwendung mit STL-Containertypen und möglicherweise anderen Vorlagen erforderte eine spezielle Anpassung der Zuordnung (oder Sie stürzen ab).
    • Bestimmte Compiler benötigen besondere Sorgfalt, um Abstürze bei Funktionsaufrufen (GCC-Fenster) zu vermeiden.

GMTL

Vorteile: LGPL, Fairly Simple API, speziell für Grafik-Engines entwickelt. Enthält viele primitive Typen, die auf das Rendern ausgerichtet sind (z. B. Ebenen, AABB, Quatenrionen mit Mehrfachinterpolation usw.), die in keinem anderen Paket enthalten sind. Sehr geringer Speicheraufwand, recht schnell und einfach zu bedienen. Alle Header basieren, keine Verknüpfung erforderlich.

Idiocyncracies / Nachteile:

  • API ist schrullig
    • Was myVec.x () in einer anderen Bibliothek sein könnte, ist nur über myVec [0] verfügbar (Lesbarkeitsproblem)
      • Ein Array oder ein stl :: -Vektor von Punkten kann dazu führen, dass Sie etwas wie pointsList [0] [0] ausführen, um auf die x-Komponente des ersten Punkts zuzugreifen
    • In einem naiven Optimierungsversuch wurde cross (vec, vec) entfernt und durch makeCross (vec, vec, vec) ersetzt, wenn der Compiler ohnehin unnötige Temps eliminiert
    • Normale mathematische Operationen geben keine normalen Typen zurück, es sei denn, Sie schalten einige Optimierungsfunktionen aus, z. B.: vec1 - vec2Gibt keinen normalen Vektor zurück und length( vecA - vecB )schlägt daher fehl, obwohl dies vecC = vecA - vecBfunktioniert. Sie müssen wie folgt einwickeln:length( Vec( vecA - vecB ) )
    • Operationen an Vektoren werden eher von externen Funktionen als von Mitgliedern bereitgestellt. Dies kann dazu führen, dass Sie die Bereichsauflösung überall verwenden müssen, da häufig verwendete Symbolnamen kollidieren können
    • Sie müssen tun
        length( makeCross( vecA, vecB ) )
      oder
        gmtl::length( gmtl::makeCross( vecA, vecB ) )
      wo Sie es sonst versuchen könnten
        vecA.cross( vecB ).length()
  • nicht gut gepflegt
    • immer noch als "Beta" behauptet
    • In der Dokumentation fehlen grundlegende Informationen, z. B. welche Header für die Verwendung normaler Funktionen benötigt werden
      • Vec.h enthält keine Operationen für Vektoren, VecOps.h enthält einige, andere befinden sich beispielsweise in Generate.h. cross (vec &, vec &, vec &) in VecOps.h, [make] cross (vec &, vec &) in Generate.h
  • unreife / instabile API; ändert sich immer noch.
    • Zum Beispiel wurde "cross" von "VecOps.h" zu "Generate.h" verschoben, und dann wurde der Name in "makeCross" geändert. Dokumentationsbeispiele schlagen fehl, da immer noch auf alte Versionen von Funktionen verwiesen wird, die nicht mehr vorhanden sind.

NT2

Kann nicht sagen, weil sie mehr am fraktalen Bildheader ihrer Webseite als am Inhalt interessiert zu sein scheinen. Sieht eher nach einem akademischen Projekt als nach einem ernsthaften Softwareprojekt aus.

Letzte Veröffentlichung vor über 2 Jahren.

Anscheinend keine Dokumentation auf Englisch, obwohl angeblich irgendwo etwas auf Französisch ist.

Ich kann keine Spur einer Community rund um das Projekt finden.

LAPACK & BLAS

Vorteile: Alt und ausgereift.

Nachteile:

  • alt wie Dinosaurier mit wirklich beschissenen APIs
Catskul
quelle
1
In Bezug auf die eigenausgerichteten Asserts: Um eine hohe Leistung aus SSE-Operationen (1,2,3 oder 4) für kleine Datensätze zu erzielen, benötigen Sie unbedingt ausgerichtete Daten. Die nicht ausgerichteten Lade- / Speichervorgänge sind viel langsamer. Die Entscheidung zwischen ausgerichtetem oder nicht ausgerichtetem Laden / Speichern nimmt ebenfalls Zeit in Anspruch. Jede "Allzweck" -Implementierung würde es wirklich schwer haben, für alle das Richtige zu tun, es sei denn, sie trennten die Schnittstelle ebenfalls in "ausgerichtete" und "nicht ausgerichtete" Operationen - und dann ist es einfach kein sehr allgemeiner Zweck.
Joris Timmermans
@Catskul Ich möchte Eigen3 verwenden. Könnten Sie bitte "die Optimierungen, die es unsicher machen, können mit einer Definition deaktiviert werden" erweitern? Die anderen Probleme, die Sie unter Eigen2 auflisten, werden im Dokument unter Themen im Zusammenhang mit Ausrichtungsproblemen sorgfältig beschrieben . Ich kann mit diesen Problemen leben.
Ali
Die Sicherheitsprobleme, auf die ich mich beziehe, beziehen sich auf alle Ausrichtungsprobleme und sind die gleichen wie bei Eigen2. Wenn Sie mit Eigen2 einverstanden sind, sind Sie mit Eigen3 in Ordnung.
Catskul
2
BLAS und LAPACK sind eigentlich keine Bibliotheken, sondern Spezifikationen / APIs. Sie hätten ihre ersten Implementierungen durch netlib oder andere Implementierungen wie ATLAS und OpenBLAS erwähnen können.
Foad
12

Für das, was es wert ist, habe ich sowohl Eigen als auch Armadillo ausprobiert. Nachfolgend finden Sie eine kurze Bewertung.

Eigene Vorteile: 1. Vollständig in sich geschlossen - keine Abhängigkeit von externem BLAS oder LAPACK. 2. Dokumentation anständig. 3. Angeblich schnell, obwohl ich es nicht auf die Probe gestellt habe.

Nachteil: Der QR-Algorithmus gibt nur eine einzige Matrix zurück, wobei die R-Matrix in das obere Dreieck eingebettet ist. Keine Ahnung, woher der Rest der Matrix kommt, und auf keine Q-Matrix kann zugegriffen werden.

Gürteltier Vorteile: 1. Große Auswahl an Zerlegungen und anderen Funktionen (einschließlich QR). 2. Ziemlich schnell (verwendet Ausdrucksvorlagen), aber ich habe es nicht wirklich auf hohe Dimensionen gebracht.

Nachteile: 1. Abhängig von externem BLAS und / oder LAPACK für Matrixzerlegungen. 2. Die Dokumentation fehlt IMHO (einschließlich der Besonderheiten von LAPACK, außer dem Ändern einer # define-Anweisung).

Wäre schön, wenn eine Open-Source-Bibliothek verfügbar wäre, die in sich geschlossen und einfach zu bedienen ist. Ich bin seit 10 Jahren auf dasselbe Problem gestoßen, und es wird frustrierend. Irgendwann habe ich GSL für C verwendet und C ++ - Wrapper darum geschrieben, aber mit modernem C ++ - insbesondere unter Verwendung der Vorteile von Ausdrucksvorlagen - sollten wir uns im 21. Jahrhundert nicht mit C herumschlagen müssen. Nur mein Tuppencehapenny.

Francis Urquhart
quelle
2
Armadillo hat eine bewusste Matlab-ähnliche Syntax, so dass es einfach zu bedienen ist. Ich bin mir nicht sicher, was Sie mit "Dokumentation fehlt ... Einzelheiten zu LAPACK" meinen. In der Dokumentation werden alle vom Benutzer verfügbaren Funktionen sowie Beispiele für deren Verwendung klar dokumentiert. Der gesamte Punkt einer C ++ - Wrapper-Bibliothek besteht darin, die Komplexität und Ausführlichkeit von LAPACK zu abstrahieren. Sie können jederzeit in der Quelle suchen, wenn Sie sehen möchten, wie Armadillo LAPACK aufruft.
Montag,
Meinen Sie über die QR-Zerlegung in Eigen Eigen2 oder Eigen3?
Qed
11

Wenn Sie nach Hochleistungsmatrix / linearer Algebra / Optimierung auf Intel-Prozessoren suchen, würde ich mir Intels MKL-Bibliothek ansehen.

MKL wurde sorgfältig für eine schnelle Laufzeitleistung optimiert - ein Großteil davon basiert auf den sehr ausgereiften BLAS / LAPACK-Fortran-Standards. Die Leistung skaliert mit der Anzahl der verfügbaren Kerne. Freisprechbare Skalierbarkeit mit verfügbaren Kernen ist die Zukunft des Rechnens und ich würde keine Mathematikbibliothek für ein neues Projekt verwenden, das keine Multi-Core-Prozessoren unterstützt.

Ganz kurz beinhaltet es:

  1. Grundlegende Vektor-Vektor-, Vektor-Matrix- und Matrix-Matrix-Operationen
  2. Matrixfaktorisierung (LU-Dekomposition, Einsiedler, spärlich)
  3. Anpassungs- und Eigenwertprobleme der kleinsten Quadrate
  4. Sparse lineare Systemlöser
  5. Nichtlinearer Löser der kleinsten Quadrate (Vertrauensbereiche)
  6. Plus Signalverarbeitungsroutinen wie FFT und Faltung
  7. Sehr schnelle Zufallszahlengeneratoren (Mersenne Twist)
  8. Viel mehr .... siehe: Linktext

Ein Nachteil ist, dass die MKL-API abhängig von den von Ihnen benötigten Routinen sehr komplex sein kann. Sie können sich auch die IPP-Bibliothek (Integrated Performance Primitives) ansehen, die auf leistungsstarke Bildverarbeitungsvorgänge ausgerichtet ist, aber dennoch recht umfangreich ist.

Paul

CenterSpace-Software, .NET-Mathematikbibliotheken, centerpace.net

Paul
quelle
8

Ich habe gute Dinge über Eigen und NT2 gehört , aber auch nicht persönlich verwendet. Es gibt auch Boost.UBLAS , von dem ich glaube, dass es ein bisschen lang wird. Die Entwickler von NT2 erstellen die nächste Version mit der Absicht, sie in Boost zu integrieren, damit dies für etwas zählt.

Mein Lin. alg. Die Anforderungen gehen nicht über den 4x4-Matrix-Fall hinaus, daher kann ich keine Kommentare zu erweiterten Funktionen abgeben. Ich weise nur auf einige Optionen hin.

Jeff Hardy
quelle
Nach meiner Erfahrung (größere Matrizen) wird Boost.UBLAS häufiger verwendet. Als ich es mir ansah, gefiel es mir jedoch nicht (hauptsächlich wegen der Dokumentation), also konzentrierte ich mich auf Eigen. Eigen hat ein Geometriemodul , aber ich habe es selbst nicht verwendet.
Jitse Niesen
Eigen wird anscheinend von ROS (Willow Garage), Celestia, Koffice und libmv verwendet. Ich sehe einige Gespräche über UBLAS, aber es fiel mir schwer, auf ein Projekt zu stoßen, das damit Werbung macht. Das Gleiche gilt für NT2. Können Sie näher erläutern, welche guten Dinge Sie gehört haben?
Catskul
In einer Diskussion auf der Boost-Mailingliste über das Hinzufügen einer modernen LinAlg-Bibliothek zu Boost wurden Eigen und NT2 als mögliche Kandidaten genannt, aber nur die NT2-Entwickler zeigten Interesse daran, dies fortzusetzen. Beide Bibliotheken schienen anständig zu sein; Wie Sie sagten, ist Eigen etwas populärer und auch C ++ - ish; NT2 wurde entwickelt, um MATLAB so gut wie möglich nachzuahmen.
Jeff Hardy
8

Ich bin neu in diesem Thema, daher kann ich nicht viel sagen, aber BLAS ist so ziemlich der Standard im wissenschaftlichen Rechnen. BLAS ist eigentlich ein API-Standard, der viele Implementierungen hat. Ich bin mir ehrlich gesagt nicht sicher, welche Implementierungen am beliebtesten sind oder warum.

Wenn Sie auch allgemeine lineare Algebraoperationen (Lösen von Systemen, Regression der kleinsten Quadrate, Zerlegung usw.) ausführen möchten, schauen Sie in LAPACK .

davidtbernal
quelle
7

Was ist mit GLM ?

Es basiert auf der OpenGL Shading Language (GLSL) -Spezifikation und wird unter der MIT-Lizenz veröffentlicht. Deutlich auf Grafikprogrammierer ausgerichtet

user3742582
quelle
Nun, es bietet Grafikprogrammiervektor und Matrizen. Es bringt eine Menge Overhead mit sich, um GLSL-konform zu halten (wenn Sie es in GLSL tun können, ist es meistens besser, es in GLSL zu tun, insbesondere mit GL 4.x), und es fehlen viele Grundelemente für die Grafikprogrammierung (Frustum, AABB, BB, Ellipsoid) ). Seine Swizzle-Oberfläche ist fettleibig. Eine viel bessere Alternative wäre, wenn ".xyzz ()" - Funktionen mit einer gewissen Codegenerierung generiert würden. Es ist perfekt, wenn Sie OpenGL-Anwendungen prototypisieren müssen und bei größeren Projekten seine negativen Seiten zeigen müssen. Codieren Sie niemals eine Mathematikbibliothek.
CoffeDeveloper
5

Ich werde Eigen hinzufügen: Ich habe viel Code (3D-Geometrie, lineare Algebra und Differentialgleichungen) aus verschiedenen Bibliotheken in diese Bibliothek portiert - was in fast allen Fällen sowohl die Leistung als auch die Lesbarkeit des Codes verbessert.

Ein Vorteil, der nicht erwähnt wurde: Es ist sehr einfach, SSE mit Eigen zu verwenden, was die Leistung von 2D-3D-Operationen erheblich verbessert (wobei alles auf 128 Bit aufgefüllt werden kann).

ima
quelle
1
Das ganze "Wenn du das tust, dann achte darauf ..." scheint mir eine rote Fahne zu sein. Bisher bin ich zweimal auf diese Probleme gestoßen und habe gerade angefangen, sie zu verwenden. Ich hatte wirklich gehofft, zukünftige Entwickler nicht dafür zu belasten, dass sie alle Arten von Besonderheiten jeder Bibliothek kennen: insbesondere die Ausrichtungsprobleme, bei denen es zum Absturz kommt, wenn Sie bestimmte Makros nicht jedes Mal verwenden, wenn Sie Mitglieder haben, und die Tatsache, dass sie Funktionen für Einzelpersonen verbreitet haben Klassen über mehrere Header. Alleine hindert es mich vielleicht nicht daran, es zu wählen, aber es wird ein bisschen wie eine rote Fahne hochgeschickt.
Catskul
1
Die Ausrichtung und dieses Makro sind nur wichtig, wenn Sie SSE verwenden, was keinesfalls erforderlich ist. Und wenn Sie SIMD verwenden, treten diese Probleme unabhängig von der verwendeten Bibliothek auf. Zumindest stürzt Eigen nicht nur ab, sondern liefert aussagekräftige Fehlermeldungen, die direkt auf das Problem hinweisen.
Ima
Und es gibt eine einfache Möglichkeit, Ausrichtungsmakros zu vermeiden: Verwenden Sie Zeiger oder Referenzen als Elemente.
Ima
1
Ich denke nicht, dass das wahr ist. Ich habe keine speziellen SSE-Optionen verwendet und bin nach der Verwendung mit STL-Containern mehrfach abgestürzt. Ja, ich weiß, dass es Ihnen hilfreiche Nachrichten gibt, und ja, ich weiß, dass es spezielle Anweisungen gibt, aber das ist mein Punkt. Ich möchte andere Entwickler nicht mit speziellen Anweisungen für jede enthaltene Bibliothek belasten. Die Sache mit dem Wert "Nicht vorbeigehen" ist zum Beispiel einfach zu viel.
Catskul
Ich habe gerade herausgefunden, dass der neueste Entwicklungszweig einige Definitionen enthält, mit denen Sie die Ausrichtung deaktivieren und die damit verbundenen Probleme vermeiden können.
Catskul
4

Okay, ich glaube ich weiß was du suchst. Es scheint, dass GGT eine ziemlich gute Lösung ist, wie Reed Copsey vorgeschlagen hat.

Persönlich haben wir unsere eigene kleine Bibliothek gerollt, weil wir uns viel mit rationalen Punkten beschäftigen - viele rationale NURBS und Beziers.

Es stellt sich heraus, dass die meisten 3D-Grafikbibliotheken Berechnungen mit projektiven Punkten durchführen, die keine Grundlage für projektive Mathematik haben, da Sie damit die gewünschte Antwort erhalten. Am Ende haben wir Grassmann-Punkte verwendet, die eine solide theoretische Grundlage haben und die Anzahl der Punkttypen verringert haben. Grassmann-Punkte sind im Grunde die gleichen Berechnungen, die derzeit verwendet werden, mit dem Vorteil einer robusten Theorie. Am wichtigsten ist, dass es die Dinge in unseren Köpfen klarer macht, sodass wir weniger Fehler haben. Ron Goldman schrieb einen Artikel über Grassmann-Punkte in der Computergrafik mit dem Titel "Über die algebraischen und geometrischen Grundlagen der Computergrafik" .

Nicht direkt mit Ihrer Frage verbunden, aber eine interessante Lektüre.

tfinniga
quelle
Es ist absichtlich offen, weil ich nicht weiß, was die Kompromisse sind. Es ist wahrscheinlich fair zu sagen, dass Geometrie unser Hauptanliegen ist, die Dimensionalität der Geometrie ist nicht klar. Derzeit ist es 2/3 (2 + Zeit) und könnte hypothetisch ziemlich hoch sein (3dims + Zeit + Multi-Dim-Costmaps).
Catskul
Ich bin mit der Frage einverstanden. Zum Beispiel benötigen viele Anwendungen dieser Art Echtzeitleistung (konsistentes Zeitverhalten), während viele andere in Ordnung sind, um Konsistenz und / oder Geschwindigkeit für Genauigkeit aufzugeben.
TED
Wollen Sie damit sagen, dass sich von den von Ihnen untersuchten Bibliotheken keine um NURBS und Beziers gekümmert hat? Gibt es einen besonderen Grund, eine der vorhandenen Bibliotheken nicht in Anspruch zu nehmen und die NURBS- und Bezier-Unterstützung nebeneinander aufzubauen?
Catskul
Ich wollte damit sagen, dass rationale NURBS und Beziers viel häufiger rationale Kontrollpunkte verwenden als die meisten 3D-Anwendungen, sodass wir mehr Fehler gemacht haben. Normalerweise haben die meisten 3D-Apps nur Vanille-3D-Punkte und -Vektoren, bis Sie die Perspektiventransformation durchlaufen haben. Viele unserer Algorithmen müssen in der Lage sein, gewichtete / rationale / projektive und kartesische Punkte, Hin- und
Hergehen
0

FLENS

http://flens.sf.net

Es implementiert auch viele LAPACK-Funktionen.

Michael Lehn
quelle
0

Ich fand diese Bibliothek recht einfach und funktional ( http://kirillsprograms.com/top_Vectors.php ). Dies sind Bare-Bone-Vektoren, die über C ++ - Vorlagen implementiert werden. Keine ausgefallenen Dinge - genau das, was Sie mit Vektoren tun müssen (Addieren, Subtrahieren, Multiplizieren, Punktieren usw.).

Clark Gamble
quelle
1
Ab Dezember 2019 ist die Verbindung leider unterbrochen
10762409 sagt Reinstate Monica