【问题标题】:Matrix classes in c++c++中的矩阵类
【发布时间】:2009-08-14 22:19:03
【问题描述】:

我正在做一些线性代数数学,并且正在寻找一些真正轻量级且易于使用的矩阵类,它们可以处理不同的维度:基本上是 2x2、2x1、3x1 和 1x2。 我认为这样的类可以用模板来实现,并且在某些情况下使用一些专业化来提高性能。 有人知道任何可用的简单实现吗?我不想要“臃肿”的实现,因为我将在内存受限的嵌入式环境中运行它。

谢谢

【问题讨论】:

  • 这是另一个完整的库,但也可能太大了(称为 eigen):eigen.tuxfamily.org/index.php?title=Main_Page
  • Eigen 绝对是最好的库。它不是太大,最重要的是模板化并针对固定大小的小矩阵进行了优化。

标签: c++ math matrix linear-algebra


【解决方案1】:

你可以试试Blitz++——或者Boost's uBLAS

【讨论】:

  • 这两个都很好。我使用 Boost 的版本,因为语法更简单;尽管我相信闪电战仍然更快。请注意,大多数基准测试都集中在大型矩阵上,其中由于缓存而花哨的内存访问模式很重要——对于这种微小的矩阵,它可能不会。无论如何,两者都是相当轻量级的:扩展的 api 几乎都是编译时模板:您编译的代码不会包含任何不必要的额外字段、检查或代码。
  • 谢谢,但这些比我需要的要大一些。我只需要一些案例(如上所述的 4 个),所以使用完整的库太多了。可能我正在寻找一些更像爱好的实现,它提供了基本案例。也许我得自己做..
  • 这取决于你,但我注意到使用库几乎总是更快。 (当然,出于业余爱好,您自己会学到更多。) Boost 享有盛誉,您将获得的不仅仅是 uBLAS——我建议您看看他们的其他产品。仅 BOOST_FOREACH 就值得下载。
  • 听起来像是一个周末项目。
  • @AI:所有这些库都是纯模板库,所以就内存而言,您只需为使用的部分付费。警告:我几乎是 C++ 模板的初学者,所以你不妨检查一下。
【解决方案2】:

我最近查看了各种 C++ 矩阵库,我投票给了Armadillo

  • 该库是大量模板化的,并且只有标头。
  • Armadillo 还利用模板实现延迟评估框架(在编译时解决),以最大限度地减少生成代码中的临时性(从而减少内存使用并提高性能)。
  • 但是,这些高级功能只是编译器的负担,而不是您在嵌入式环境中运行的实现,因为大多数 Armadillo 代码在编译期间会“蒸发”,因为其设计方法是基于模板的。
  • 尽管如此,其主要设计目标之一是易于使用 - 该 API 在风格上刻意与 Matlab 语法相似(请参阅网站上的比较表)。

此外,虽然犰狳可以独立工作,但您可能需要考虑将其与可用的 LAPACK(和 BLAS)实现一起使用以提高性能。例如OpenBLAS(或ATLAS)是一个不错的选择。查看Armadillo's FAQ,它涵盖了一些重要的主题。

在 Google 上快速搜索发现 this presentation 表明犰狳已经用于嵌入式系统。

【讨论】:

    【解决方案3】:

    std::valarray 非常轻量级。

    【讨论】:

    • 我需要比原始数组更多的东西,比如维度检查(即,将 1x2 与 2x2 矩阵相乘是可以的,但 2x1 与 2x2 则不行),否则我几乎要手动完成。
    【解决方案4】:

    我使用Newmat libraries 进行矩阵计算。它是开源且易于使用的,尽管我不确定它是否符合您对轻量级的定义(它包含 50 多个源文件,Visual Studio 将其编译成一个 1.8MB 的静态库)。

    【讨论】:

      【解决方案5】:

      CML 矩阵相当不错,但对于嵌入式环境来说可能不够轻量级。还是看看吧:http://cmldev.net/?p=418

      【讨论】:

        【解决方案6】:

        另一种选择,虽然可能为时已晚:

        https://launchpad.net/lwmatrix

        【讨论】:

          【解决方案7】:

          我找不到足够简单的库,所以我自己编写了它:http://koti.welho.com/aarpikar/lib/

          我认为它应该能够通过简单地将一些行或列设置为零来处理不同的矩阵尺寸(2x2、3x3、3x1 等)。这不是最快的方法,因为内部所有操作都将使用 4x4 矩阵完成。尽管理论上可能存在一种可以一次性处理 4x4 操作的处理器。至少我宁愿​​相信存在这样的处理器,而不是去优化那些低级矩阵计算。 :)

          【讨论】:

            【解决方案8】:

            将矩阵存储在数组中怎么样,比如

            2x3 matrix = {2,3,val1,val2,...,val6}
            

            这真的很简单,加法运算也很简单。但是,您需要编写自己的乘法函数。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-01-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-11-18
              • 2012-11-20
              • 1970-01-01
              相关资源
              最近更新 更多