C++ 特征值:获得步长为2的矩阵的下一个块

C++ 特征值:获得步长为2的矩阵的下一个块,c++,eigen,C++,Eigen,Eigen支持步幅为2的下一个方块吗 我观察到默认行为是在以下情况下使用stride=1: m.block<F, F>(i, j) m.block(i,j) 我正在寻找一种解决方案,它可以为我提供下一个非1步幅的方块,如以下链接中的动画卷积演示所示: 如果Eigen不支持它,那么使用stride=k获取下一个块的好方法是什么?您可以使用Eigen::Map声明跨步: int main() { constexpr int d = 10; MatrixXi m(d,

Eigen支持步幅为2的下一个方块吗

我观察到默认行为是在以下情况下使用stride=1:

m.block<F, F>(i, j)
m.block(i,j)
我正在寻找一种解决方案,它可以为我提供下一个非1步幅的方块,如以下链接中的动画
卷积演示所示:


如果Eigen不支持它,那么使用
stride=k
获取下一个块的好方法是什么?

您可以使用
Eigen::Map
声明跨步:

int main()
{
    constexpr int d = 10;
    MatrixXi m(d,d);
    VectorXi lin = VectorXi::LinSpaced(d*d, 0, d*d-1);
    m = Map<MatrixXi>(lin.data(), d, d);
    std::cout << m << "\n\n";

    std::cout << Map<MatrixXi, 0, InnerStride<2>>(m.data() + d + 1, 3, 3) << "\n\n";
    std::cout << Map<MatrixXi, 0, OuterStride<d>>(m.data() + d + 1, 3, 3) << "\n\n";
    // You probably want either this:
    std::cout << Map<MatrixXi, 0, Stride<d, 2>>  (m.data() + d + 1, 3, 3) << "\n\n";
    // or this:
    std::cout << Map<MatrixXi, 0, Stride<2*d, 2>>(m.data() + d + 1, 3, 3) << "\n\n";
    return 0;
}
intmain()
{
constexpr int d=10;
MatrixXi m(d,d);
向量xi lin=VectorXi::LinSpaced(d*d,0,d*d-1);
m=映射(lin.data(),d,d);

std::cout使用将在Egeng 3.4中引入的新切片和索引API(目前在主分支中),您可以编写Matlab风格的切片,例如

   M(Eigen::seqN(i, Eigen::fix<F>, Eigen::fix<stride>),
     Eigen::seqN(j, Eigen::fix<F>, Eigen::fix<stride>));
M(Eigen::seqN(i,Eigen::fix,Eigen::fix),
Eigen::seqN(j,Eigen::fix,Eigen::fix));
返回一个从
(i,j)
开始的块,其大小为
F x F
,步长为
stride
Eigen::fix
是可选的,但可能会提供更好的运行时间

工作示例:

更多文档:


使用AviGinsburg 3.3。你需要写一些<代码>地图> /Calp-的解决方案,如@,.p/>。看起来我将不得不更新我的知识(再次)。好的。请不要标记C++问题,因为CI认为问题的隐藏部分是我们是否应该使用<代码>新INT[][]?对于大矩阵,<代码> >或代码>向量< /代码>。因此,我将其标记为C++,而CNeither则不知道代码< >新< /Cord>关键字,也不知道模板。@ CPung也不。如果使用EGIN,请使用它们的类型(例如“Matrix Xi”)。