本征:获取矩阵的下一个块,步长 = 2
eigen: get next block of the matrix with stride =2
Eigen 是否支持以 stride =2 获取下一个块?
我观察到默认行为是步长 =1:
m.block<F, F>(i, j)
我正在寻找可以给我下一个非 1 步长的块的解决方案,如下面 link 中的动画 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。
有了将在 Eigen 3.4 中引入的新切片和索引 API(目前在 master 分支中),您可以编写 Matlab 风格的切片,例如,
M(Eigen::seqN(i, Eigen::fix<F>, Eigen::fix<stride>),
Eigen::seqN(j, Eigen::fix<F>, Eigen::fix<stride>));
Returns 一个块,从 (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
的解决方案。
Eigen 是否支持以 stride =2 获取下一个块?
我观察到默认行为是步长 =1:
m.block<F, F>(i, j)
我正在寻找可以给我下一个非 1 步长的块的解决方案,如下面 link 中的动画 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。
有了将在 Eigen 3.4 中引入的新切片和索引 API(目前在 master 分支中),您可以编写 Matlab 风格的切片,例如,
M(Eigen::seqN(i, Eigen::fix<F>, Eigen::fix<stride>),
Eigen::seqN(j, Eigen::fix<F>, Eigen::fix<stride>));
Returns 一个块,从 (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
的解决方案。