Ich benötige eine templated Sparse Matrix-Implementierung, aber nur um den Speicherbedarf zu reduzieren, nicht. Also habe ich versucht, Eigen zu verwenden, obwohl ich den Mathe-Teil nicht benötige. Warum ? Es lag zufällig auf meiner Maschine und ich hatte es schon ein wenig für andere Sachen benutzt. Aber ich bin sicherlich kein Eigenexperte!Kann ich für die allgemeinen Speicheranforderungen eigene Sparse-Matrizen verwenden?
Kontext: Ich habe eine Art T
(sagen wir struct T{int a; float b; vector<int> c; };
und ich brauche große Matrizen diese speichern (zB mehr als 1000x1000) und die meisten Werte sind null/irrelevant
Da ich nicht tun. tun, um jede Mathe, ich obwohl es genug wäre, einen assignement Betreiber bietet Speicher-/Abrufoperationen, wie die folgenden Funktionen ausführen:
int main()
{
Eigen::SparseMatrix<MyClass> mat(1000,1000); // 1000000 elements
MyClass b{ 5, 1.2 };
mat.insert(3, 4) = b;
}
So, hier ist ein Datentyp, mit dem, was ich dachte, war notwendig:
struct MyClass
{
int a;
float b;
std::vector<int> v_things;
MyClass(int aa, float bb) : a(aa), b(bb) {}
MyClass(const MyClass& other) // copy constructor
{
a = other.a;
b = other.b;
v_things = other.v_things;
}
MyClass& operator=(const MyClass& arg)
{
if(this != &arg)
{
MyClass tmp(arg);
std::swap(tmp, *this);
}
return *this;
}
};
Aber dies nicht gelingt, zu kompilieren, weil es scheint, eine besondere Form des Zuweisungsoperators zu beantragen:
/usr/include/eigen3/Eigen/src/SparseCore/SparseMatrix.h:1146:27: error: no match for ‘operator=’ (operand types are ‘Eigen::internal::CompressedStorage<MyClass, int>::Scalar {aka MyClass}’ and ‘int’)
return (m_data.value(p) = 0);'
(Compiler GCC 5.3 mit -std = C++ 11)
Fragen:
- Ist es möglich, dies mit Eigen zu tun?
- Wenn ja, was muss ich zum Datentyp hinzufügen? Ist das der beste Ansatz?
- Wenn nein, hätten Sie Vorschläge zu einer anderen Bibliothek?
Relevante Eigen Handbuchseiten:
- http://eigen.tuxfamily.org/dox/group__TutorialSparse.html
- http://eigen.tuxfamily.org/dox/classEigen_1_1SparseMatrix.html
- http://eigen.tuxfamily.org/dox/group__SparseQuickRefPage.html
Großer, @ggael, ich brauche auch eine leeren Standardkonstruktor hinzuzufügen und meinen ursprünglichen assignement Operator zu entfernen, sondern Werke gut jetzt. – kebs
Update: alles in Ordnung, um einzelne Elemente zu schreiben/lesen, aber Batch-Einfügen ('setFromTriplets()') scheint auch einige '+ = 'Operator zu erfordern. Das ist seltsam für mich: Warum würde das Speichern von etwas im Speicher das erfordern? Und ich habe versucht, einen hinzuzufügen, aber gescheitert ... – kebs
Fixed, werde ich eine andere Antwort mit Details posten. – kebs