本征:获得步幅为2的矩阵的下一个块

问题描述 投票:0回答:2

Eigen是否支持获得步幅= 2的下一个程序段?

我观察到默认行为是其中步幅= 1:

m.block<F, F>(i, j)

我正在寻找一种解决方案,可以使我的下一个步幅为非-1,如以下链接中的动画Convolution Demo所示:

http://cs231n.github.io/convolutional-networks/

如果Eigen不支持,用stride=k获得下一个块的索引的好方法是什么?

c++ c eigen
2个回答
3
投票

您可以这样用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;
}

请注意,您也可以在运行时设置跨度。有关详细信息,请参见documentation


0
投票

[使用新的切片和索引API,它将在Eigen 3.4中引入(当前在master分支中,您可以编写Matlab样式的切片,例如]

   M(Eigen::seqN(i, Eigen::fix<F>, Eigen::fix<stride>),
     Eigen::seqN(j, Eigen::fix<F>, Eigen::fix<stride>));

(i,j)返回大小为F x Fstride开始的块。Eigen::fix是可选的,但可能会提供更好的运行时间。

工作示例:https://godbolt.org/z/wzRdp7

更多文档:http://eigen.tuxfamily.org/dox-devel/group__TutorialSlicingIndexing.html

使用Eigen 3.3,您需要编写@AviGinsburg建议的基于Map的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.