gpt4 book ai didi

c++ - 我可以使用 Eigen 稀疏矩阵来满足一般存储要求吗

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:43:12 25 4
gpt4 key购买 nike

我需要一个模板化的稀疏矩阵实现,但只是为了减少内存占用,进行任何数值求解。所以我尝试使用 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 with -std=c++11)

问题:

  • 是否可以使用 Eigen 来做到这一点?
    • 如果是,我需要向数据类型添加什么?这是最好的方法吗?
    • 如果没有,您对另一个图书馆有什么建议吗?

相关 Eigen 手册页:

最佳答案

确实,因为它是为存储数值而设计的,所以您的类型应该可以从文字 0 构造/分配。需要确保 insert(i,j) 返回对初始化为 0 的标量的引用。

所以你可以通过添加一个虚拟的 operator= 来解决这个问题:

 MyClass& operator=(int x) { assert(x==0); /* ... */ return *this; }

编辑:

为了使用setFromTriplets,您还需要提供operator+=。原因是默认情况下,重复的条目会汇总在一起。在 Eigen 3.3 中,将仿函数(例如 lambda)传递给 setFromTriplets 来定义如何合并重复项会更简洁。在您的情况下,您可以只传递一个仿函数来触发运行时断言,如果它被调用的话:

mat.setFromTriplets(begin,end, [] (const MyClass& a,const MyClass &) {
assert(false && "found duplicates"); return a; } );

在这种情况下,您不需要定义 MyClass::operator+=

关于c++ - 我可以使用 Eigen 稀疏矩阵来满足一般存储要求吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37682868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com