我正在用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’
答案 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
以外的任何运算符都不会显示。