我可以使用特征稀疏矩阵来满足一般存储需求吗

2024-03-31

我需要一个模板化的稀疏矩阵实现,但只是为了减少内存占用,not进行任何数值求解。所以我尝试使用 Eigen,尽管我不需要数学部分。为什么 ?它恰好就在我的机器上,而且我已经用它来做其他事情了。但我肯定不是本征专家!

Context: 我有一个类型T (say 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)

问题:

  • Is it possible to do this with Eigen ?
    • 如果是,我需要在数据类型中添加什么?这是最好的方法吗?
    • 如果没有,您对另一个图书馆有什么建议吗?

相关 Eigen 手册页:

  • http://eigen.tuxfamily.org/dox/group__TutorialSparse.html http://eigen.tuxfamily.org/dox/group__TutorialSparse.html
  • http://eigen.tuxfamily.org/dox/classEigen_1_1SparseMatrix.html http://eigen.tuxfamily.org/dox/classEigen_1_1SparseMatrix.html
  • http://eigen.tuxfamily.org/dox/group__SparseQuickRefPage.html http://eigen.tuxfamily.org/dox/group__SparseQuickRefPage.html

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

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

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

Edit:

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以使用特征稀疏矩阵来满足一般存储需求吗 的相关文章

随机推荐

  • 删除字符的正确方法是什么**

    我有一个 char 基本上是一个字符串数组 我需要删除它 确保清除所有指针的正确方法是什么 经验法则是你需要一个delete or delete 对于每个new or new 您发出的 所以如果你这样做 char pp new char N
  • 未找到与 Doctrine2 多态关联的字段

    我有一个多态关联 类表继承 我需要使用 DQL 来查询特定子类的实体 可以在 WHERE 子句中使用 x INSTANCE OF Entity 来完成 现在我需要为该子类设置特定的条件 但我收到此错误 类 Person 没有名为 Stude
  • Nextjs 和 Jest 变换/transformIgnorePatterns 不适用于 esm 模块

    我对此进行了大量研究 并找到了相当多的解决方案 我找到了一种解决方法 并希望获得transform and transformIgnorePatterns在职的 然而 我唯一能做的似乎就是在我的内部手动添加一些模拟模块 mocks fold
  • 如何更改 Android 选项卡小部件的背景?

    我的类扩展了 TabActivity TabHost mTabHost getTabHost TabHost TabSpec tab1 mTabHost newTabSpec tab1 TabHost TabSpec tab2 mTabHo
  • 使用 Fluent Api 时复合键 EF Core 出现错误

    所以我在 Entity Framework Core 中有以下类 我正在尝试进行代码优先迁移 但我一生都无法弄清楚如何为这项工作提供流畅的 API public class Participants public Activity Acti
  • 通过网络扫描发现服务器IP地址

    我要开发 C 客户端 服务器应用程序 我需要告诉客户端服务器的 IP 地址是什么 它可能来自客户端或服务器广播 任何关于这方面的帮助和解决方案都会非常有用 如果有一些示例代码那就更好了 Thanks 您可以使用BroadCast方法进行广播
  • 将枚举案例的关联值提取到元组中

    我知道如何使用 switch 语句提取枚举案例中的关联值 enum Barcode case upc Int Int Int Int case quCode String var productBarcode Barcode upc 8 1
  • CUDA全局内存事务的成本

    根据 CUDA 5 0 编程指南 如果我同时使用 L1 和 L2 缓存 在 Fermi 或 Kepler 上 则所有全局内存操作都使用 128 字节内存事务完成 但是 如果我仅使用 L2 则使用 32 字节内存事务 第 F 4 2 章 让我
  • 建议在 C#.NET 中加密 XML 文件的最佳算法?

    我必须加密 XML 文件并通过网络发送到私人服务器中 我的另一个应用程序将通过提供实际的公钥来解密文件并将其导入到 SQL 你能建议我最好的方法吗 File XML类型 可能的尺寸 最大 250 MB 技术 C NET 2008 Use X
  • YUI 压缩机和 .NET 应用程序

    我想使用 YUI Compressor 原始版本 并将其用作典型 MS 构建过程 Visual Studio 2008 MSBuild 的一部分 有人对此有任何指导或想法吗 例如 合并到项目中的好方法 如何处理现有的 CSS 和 JS 引用
  • 尝试拟合 CrossValidator 对象时 DataBricks PySpark 出错

    首先 我是 DataBricks 和 PySpark 的新手 所以如果这是我没有看到的简单解决方案 我深表歉意 我的集群位于 DataBricks 运行时 9 1 LTS Spark 3 1 2 Scala 2 12 上 我正在研究一个 N
  • 在 Perl 中如何使用变量作为变量名?

    我需要在 perl 中实现以下目标 printmsg val1 msg1 if val1 printmsg val2 msg2 if val2 printmsg val3 msg3 if val3 printmsg val4 msg4 if
  • return 语句之前/期间的 C 分段错误

    我在 return 语句之前打印要返回的值 并告诉我的代码打印在函数调用之后立即返回的值 但是 在第一个打印语句之后和第二个打印语句之前 我遇到了分段错误 还值得注意的是 这种情况总是发生在第三次调用该函数时 从来没有第一次或第二次 也从来
  • 修改访客的捆绑属性

    我应该如何从访问者内部修改顶点的捆绑属性 我想使用对图进行子脚本化的简单方法 但传递给访问者的图参数是 const 因此编译器不允许更改 我可以在访问者中存储对图表的引用 但这看起来很奇怪 A visitor which identifie
  • 计算 Java 对象的值?

    我有一个用于存储项目的 Java 对象 public class PaymentDetailsItem private String name private String amount private int quantity priva
  • 在 Excel5.php 中找不到类“PHPExcel”

    我在 PHPExcel 中收到以下错误 Fatal error Class PHPExcel not found in PHPExcel Reader Excel5 php on line 587 这很奇怪 因为我在网上搜索时没有遇到过它
  • 尽管 rake 路线中有一条路线,但没有路线匹配

    我变得奇怪ActionController RoutingError No route matches 可以生成路线 gt r Rails application routes gt r generate controller items
  • 通用语言对 PCRE(Perl 兼容正则表达式)有哪些支持?

    我对 PCRE Perl 兼容正则表达式 的强大功能很感兴趣 并且想知道它们是否有可能成为所有主要语言中事实上的方法 我对 Java 感兴趣 如果有必要 我准备使用图书馆 我也无法在 SO 中找到一个很好的页面来描述 PCRE 的优缺点 因
  • Web 服务存根生成 + android

    我想生成一个基于 android java 的 STUB 来访问所有 Web 服务 我尝试使用以下工具生成存根 1 用于 CLDC 的 Sun Java TM 无线工具包 2 5 2 01 2 ksoap2 生成 stub 0 1 SNAP
  • 我可以使用特征稀疏矩阵来满足一般存储需求吗

    我需要一个模板化的稀疏矩阵实现 但只是为了减少内存占用 not进行任何数值求解 所以我尝试使用 Eigen 尽管我不需要数学部分 为什么 它恰好就在我的机器上 而且我已经用它来做其他事情了 但我肯定不是本征专家 Context 我有一个类型