本征库中具有步幅的子矩阵
Submatrix with stride in Eigen Library
我是 Eigen 的新手,我想创建 10 个 mxn 矩阵。
由于某些原因,我使用以下方法进行操作:
Matrix<double, m, n*10>
其中内存分配似乎类似于以下内容:
_______________________________________________________________
|M1(1,1)|M2(1,1)|...|M10(1,1)|.....|M1(1,n)|M2(1,n)|...|M10(1,n)|
| . . |
| . |
现在如何为这 10 个矩阵中的每一个创建一个参考矩阵(通过参考而不复制数据)?
我建议使用动态分配的矩阵,因为 m
和 n
可能很大。此外,当默认值是列主要时,您似乎假设矩阵内存是行主要的。在下面的示例中,我已明确将它们设置为主要行。
您可以像这样使用系列Eigen::Map<MatrixXd>
:
#include <Eigen/Core>
#include <iostream>
using namespace Eigen;
int main(void)
{
int m = 3;
int n = 4;
int x = 6;
typedef Matrix < double, Dynamic, Dynamic, RowMajor > ourMat;
ourMat M1(m, n * x);
M1.setConstant(9.9);
for (int i = 0; i < x; i++)
{
Eigen::Map<ourMat, 0, Stride<Dynamic, Dynamic>> m_i(M1.data() + i,
m, n,
Stride<Dynamic, Dynamic>(n*x,x));
m_i.setConstant(double(i));
std::cout << m_i << std::endl;
std::cout << M1 << "\n" << std::endl;
}
Eigen::Map<VectorXd> m_i(M1.data(), m * n * x);
std::cout << m_i.transpose() << std::endl;
return 0;
}
我是 Eigen 的新手,我想创建 10 个 mxn 矩阵。 由于某些原因,我使用以下方法进行操作:
Matrix<double, m, n*10>
其中内存分配似乎类似于以下内容:
_______________________________________________________________
|M1(1,1)|M2(1,1)|...|M10(1,1)|.....|M1(1,n)|M2(1,n)|...|M10(1,n)|
| . . |
| . |
现在如何为这 10 个矩阵中的每一个创建一个参考矩阵(通过参考而不复制数据)?
我建议使用动态分配的矩阵,因为 m
和 n
可能很大。此外,当默认值是列主要时,您似乎假设矩阵内存是行主要的。在下面的示例中,我已明确将它们设置为主要行。
您可以像这样使用系列Eigen::Map<MatrixXd>
:
#include <Eigen/Core>
#include <iostream>
using namespace Eigen;
int main(void)
{
int m = 3;
int n = 4;
int x = 6;
typedef Matrix < double, Dynamic, Dynamic, RowMajor > ourMat;
ourMat M1(m, n * x);
M1.setConstant(9.9);
for (int i = 0; i < x; i++)
{
Eigen::Map<ourMat, 0, Stride<Dynamic, Dynamic>> m_i(M1.data() + i,
m, n,
Stride<Dynamic, Dynamic>(n*x,x));
m_i.setConstant(double(i));
std::cout << m_i << std::endl;
std::cout << M1 << "\n" << std::endl;
}
Eigen::Map<VectorXd> m_i(M1.data(), m * n * x);
std::cout << m_i.transpose() << std::endl;
return 0;
}