Eigen是否支持获得步幅= 2的下一个程序段?
我观察到默认行为是其中步幅= 1:
m.block<F, F>(i, j)
我正在寻找一种解决方案,可以使我的下一个步幅为非-1,如以下链接中的动画Convolution Demo
所示:
http://cs231n.github.io/convolutional-networks/
如果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;
}
请注意,您也可以在运行时设置跨度。有关详细信息,请参见documentation。
[使用新的切片和索引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 F
的stride
开始的块。Eigen::fix
是可选的,但可能会提供更好的运行时间。
工作示例:https://godbolt.org/z/wzRdp7
更多文档:http://eigen.tuxfamily.org/dox-devel/group__TutorialSlicingIndexing.html
使用Eigen 3.3,您需要编写@AviGinsburg建议的基于Map
的解决方案。