你如何在 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=
之外的任何运算符。
我正在用 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=
之外的任何运算符。