Мне нужна схематичная разреженная матричная реализация, но только для уменьшения объема памяти, не делать какие-либо численные решения. Поэтому я попытался использовать Eigen, хотя мне не нужна математическая часть. Зачем ? Это просто лежало на моей машине, и я уже немного использовал его для других вещей. Но я, конечно, не эксперт Эйгена!Могу ли я использовать Eigen разреженные матрицы для общих требований к хранению
Контекст: У меня есть тип T
(скажем struct T{int a; float b; vector<int> c; };
и мне нужно хранить большие матрицы этого (скажем, более чем 1000x1000) и большинство значений равны нулю/значения
Поскольку у меня нет. делать какие-либо математику, я, хотя это было бы достаточно, чтобы обеспечить оператору присваивания делать операции хранения/извлечения, как показано в следующем:
int main()
{
Eigen::SparseMatrix<MyClass> mat(1000,1000); // 1000000 elements
MyClass b{ 5, 1.2 };
mat.insert(3, 4) = b;
}
Так вот это тип данных, с тем, что я считал нужным:
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;
}
};
Но это не удается скомпилировать, потому что кажется, просить какой-то особый вид оператора присваивания:
/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);'
(составитель: GCC 5.3 с -std = C++ 11)
Вопросы:
- Возможно ли это сделать с Eigen?
- Если да, то что мне нужно добавить к типу данных? Это лучший подход?
- Если нет, у вас есть предложение по другому либрите?
Соответствующие Собственные страницы руководства:
- 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
Отлично @ggael, я также нужно добавить пустой конструктор по умолчанию и удалить мой исходный оператор присваивания, но работает сейчас хорошо. – kebs
Обновление: все нормально писать/читать отдельные элементы, но пакетная вставка ('setFromTriplets()'), по-видимому, требует также некоторого оператора '+ ='. Это странно для меня: зачем хранить что-то в памяти? И я попытался добавить один, но не удалось ... – kebs
Исправлено, я отправлю еще один ответ с подробностями. – kebs