외부 보폭은 데이터 저장과 관련된 매개 변수입니다. 보다 보편적으로 사용되는 이름은 선행 차원입니다. 여기서 몇 가지 설명을 찾을 수 있습니다. 기존의 매트릭스 기본적
http://www.ibm.com/support/knowledgecenter/SSFHY8_5.3.0/com.ibm.cluster.essl.v5r3.essl100.doc/am5gr_leaddi.htm
은 변경할 수 없습니다. 행렬 요소를 변경하지 않고 행렬을 변경하는 유일한 방법은 다른 외부 보들 설정을 사용하여 행렬을 새로운 메모리 공간으로 복사하는 것입니다. 이것은 일반적으로 행렬을 다른 행렬로 복사 할 때 발생합니다.
열 주 행렬의 경우 최소한 가능한 외부 보폭은 인쇄 한 번호와 같은 행 수와 같습니다.
Eigen을 사용하는 경우 Eigen에서 보통 처리하므로 걱정할 필요가 없습니다. Eigen::Map
.
코드가 실제로 작동하지 않습니다. stride를 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;
}
출력을 비교하십시오. 당신이 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;
}
에 배열을 확장 할 경우
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
출력은
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
당신은 또한 mat
에 map1
를 복사 할 때 외부 보폭이 변경 볼 수있을 것입니다. 희망 사항은 스트라이드가 무엇인지 더 잘 볼 수 있기를 바랍니다.
실제로 원래 코드에서 Map
을 잘못 사용하고 있습니다. Map()
을 Matrix mat
으로 복사하면 안됩니다. 그 이유는 mat
의 보폭을 인쇄 할 때 항상 4입니다. 불필요한 데이터 복사를 제거하고 보폭을 map1
/map2
으로 인쇄하면됩니다.
왜 변경 하시겠습니까? 어떻게 코드를 바꿀 수 있는지 보여 줄 수 있습니까? – kangshiyin
다른 진보의 행렬로 작업하고 싶습니다. – Martin
좀 더 구체적으로 기재 할 수 있습니까? 나는 그것을 바꾸어야하는 일반적인 행렬 연산이 있다고 상상할 수 없다. – kangshiyin