我想在编译时改变特征矩阵的外转,而不使用map函数。
我尝试使用OuterStrideAtCompileTime变量更改它,但它不起作用。有没有办法做到这一点?
还有一件事打印mat.Outerstride()每次给出输入矩阵的行数。如何打印特征矩阵的OuterStride? p>
提前致谢。
我用像
这样的地图函数定义了一个特征矩阵MatrixXf mat;
float arr[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
mat = Map<Matrix<float,Dynamic,Dynamic,Eigen::RowMajor>, 0, OuterStride<Dynamic> > (arr,4,4,OuterStride<Dynamic>(5));
只要我尝试使用
更改外部步幅,它就能正常工作mat.OuterStrideAtCompileTime = 7;
它不能正常工作。
答案 0 :(得分:0)
外跨步是与数据存储相关的参数。更常用的名称是领先维度。你可以在这里找到一些解释。
基本上对于现有矩阵,它无法更改。在不更改矩阵元素的情况下更改它的唯一方法是使用不同的外部步幅设置将矩阵复制到新的存储空间。当您将矩阵作为子矩阵复制到另一个矩阵时,通常会发生这种情况。
对于列主矩阵,最小可能的外跨步等于行数,作为打印出的数字。
使用Eigen时,您不必担心它,因为Eigen通常会为Eigen::Map
所期待的事情照顾它。
您的代码实际上并不起作用。将步幅设置为5已经超出范围,因为存储在arr
中的现有矩阵(4x4)具有步幅4和stride 5 x 4 columns = 20 > 16
。
#include <iostream>
#include <Eigen/Eigen>
int main(void) {
using namespace Eigen;
MatrixXf mat;
float arr[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
mat = Map<Matrix<float, Dynamic, Dynamic, Eigen::RowMajor>, 0,
OuterStride<Dynamic> >(arr, 4, 4, OuterStride<Dynamic>(5));
std::cout << "mat with stride 5:\n" << mat << std::endl;
mat = Map<Matrix<float, Dynamic, Dynamic, Eigen::RowMajor>, 0,
OuterStride<Dynamic> >(arr, 4, 4, OuterStride<Dynamic>(4));
std::cout << "mat with stride 4:\n" << mat << std::endl;
return 0;
}
请比较输出。
mat with stride 5:
1 2 3 4
6 7 8 9
11 12 13 14
16 0 0 5.01639e-14
mat with stride 4:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
如果将数组扩展为20个元素
#include <iostream>
#include <Eigen/Eigen>
int main(void) {
using namespace Eigen;
MatrixXf mat;
float arr[20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
Map<Matrix<float, Dynamic, Dynamic, Eigen::RowMajor>, 0, OuterStride<Dynamic> > map1(arr, 4, 4, OuterStride<Dynamic>(5));
mat = map1;
std::cout << "map1 outer stride: " << map1.outerStride() << std::endl << map1 << std::endl;
std::cout << "mat outer stride: " << mat.outerStride() << std::endl << mat << std::endl;
Map<Matrix<float, Dynamic, Dynamic, Eigen::RowMajor>, 0, OuterStride<Dynamic> > map2(arr, 4, 4, OuterStride<Dynamic>(4));
mat = map2;
std::cout << "map2 outer stride: " << map2.outerStride() << std::endl << map2 << std::endl;
std::cout << "mat outer stride: " << mat.outerStride() << std::endl << mat << std::endl;
return 0;
}
输出
map1 outer stride: 5
1 2 3 4
6 7 8 9
11 12 13 14
16 17 18 19
mat outer stride: 4
1 2 3 4
6 7 8 9
11 12 13 14
16 17 18 19
map2 outer stride: 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
mat outer stride: 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
将map1
复制到mat
时,您还可以看到外部步幅发生变化。
希望这可以让你更好地了解步伐是什么。
事实上,在您的原始代码中,您使用的是Map
错误的方法 - 您不应该将Map()
复制到Matrix mat
。
这就是为什么当你打印mat
的步幅时,它总是4。
您需要做的是消除不必要的数据副本并打印map1
/ map2
的步伐。