你如何在Eigen中使用BandMatrix类?

时间:2016-01-20 19:50:43

标签: c++ matrix linear-algebra eigen eigen3

我正在用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课程。

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

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’

开头的编译错误

1 个答案:

答案 0 :(得分:2)

要包含它,您只需#include <Eigen/Core>(假设-I /usr/include/eigen3/),因为它包含在该文件中(Eigen / Core:line~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文件后,我不确定它是否真的能满足您的需求。它似乎只是一个没有任何频段特定操作的存储类。在使用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";
}

请注意,除了operator=之外,BandMatrix以外的任何运算符都不会显示。