你如何在 Eigen 中使用 BandMatrix class?

How do you use the BandMatrix class in Eigen?

我正在用 C++ 编写一些数字代码并选择使用 Eigen 库。原因之一是它似乎支持带状矩阵。

我能找到的唯一信息就是这个文件 http://eigen.tuxfamily.org/dox/BandMatrix_8h_source.html。但是作为 C++ 的新手,我什至不确定如何 #include 它。 (我的文件系统上有它的一个版本,在 /usr/include/eigen3/Eigen/src/Core/BandMatrix.h 下)

#include <Eigen/Core/BandMatrix>

不起作用

#include <Eigen/Core>

有,但我找不到 BandMatrix class。

你能提供一些示例代码来初始化一个 - 比如三对角 - 带状矩阵吗?任何帮助,将不胜感激!谢谢

ps。我还尝试使用不受支持的 Skyline 模块解决此问题

#include <Eigen/Skyline>

(添加 -I/usr/include/eigen3/unsupported 开关)但这会引入一堆以 /usr/include/eigen3/unsupported/Eigen/src/Skyline/SkylineUtil.h:74:44: error: type/value mismatch at argument 2 in template parameter list for ‘template<class T, class StorageKind> struct Eigen::internal::eval’

开头的编译错误

要包含它,您只需 #include <Eigen/Core>(假设 -I /usr/include/eigen3/),因为它包含在该文件中(Eigen/Core:行 ~341):

#include "src/Core/BandMatrix.h"

使用方法参考test/bandmatrix.cpp文档:

using Eigen::internal::BandMatrix;

void test_bandmatrix()
{
  typedef BandMatrix<float>::Index Index;

  for(int i = 0; i < 10*g_repeat ; i++) {
    Index rows = internal::random<Index>(1,10);
    Index cols = internal::random<Index>(1,10);
    Index sups = internal::random<Index>(0,cols-1);
    Index subs = internal::random<Index>(0,rows-1);
    CALL_SUBTEST(bandmatrix(BandMatrix<float>(rows,cols,sups,subs)) );
  }
}

阅读 BandMatrix.h 文件后,我不确定它是否真的符合您的要求。它似乎只是一个没有任何波段特定操作的存储 class。使用 band.toDenseMatrix().

复制到密集矩阵后,必须执行任何操作

至于如何初始化BandMatrix,这里有一个快速演示。

#include <Eigen/Core>
#include <iostream>

using Eigen::internal::BandMatrix;

int main()
{
    int rows = 7;
    int cols = 6;
    int sups = 2;
    int subs = 3;

    BandMatrix<float> bm(rows,cols,sups,subs);

    for(int i = -bm.subs(); i <= bm.supers(); ++i)
    {
        bm.diagonal(i).setConstant(0);
    }

    std::cout << bm.toDenseMatrix() << "\n\n";
    bm.diagonal().setConstant(1010);
    std::cout << bm.toDenseMatrix() << "\n\n";

    for(int i = 1; i <= bm.supers(); ++i)
    {
        bm.diagonal(i).setConstant(i);
    }

    for(int i = 1; i <= bm.subs(); ++i)
    {
        bm.diagonal(-i).setConstant(-i);
    }

    std::cout << bm.toDenseMatrix() << "\n\n";

    bm.diagonal(-2)(3) = 2345.f;

    std::cout << bm.toDenseMatrix() << "\n\n";
}

请注意,似乎没有为 BandMatrix 实现除 operator= 之外的任何运算符。