2016-07-04 2 views
1

지도 함수를 사용하지 않고 컴파일 할 때 고유 행렬의 외곽을 변경하고 싶습니다.지도 함수를 사용하지 않고 고유 행렬의 외곽을 변경하는 방법

OuterStrideAtCompileTime 변수를 사용하여이 변수를 변경하려고했지만 작동하지 않습니다. 그럴 수있는 방법이 있습니까?

매트를 인쇄 할 때마다 더 많은 일이 발생합니다 .Outerstride()는 매번 입력 행의 행 수를 제공합니다. 고유 행렬의 OuterStride를 인쇄하는 방법은 무엇입니까?

미리 감사드립니다.


는 난이 작동하지 않는

mat.OuterStrideAtCompileTime = 7; 

를 사용하여 외부 보폭을 변경하려고 할 때마다 그것이 잘 작동하고

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)); 

같은지도 기능을 갖는 고유 행렬을 정의 하였다.

+1

왜 변경 하시겠습니까? 어떻게 코드를 바꿀 수 있는지 보여 줄 수 있습니까? – kangshiyin

+0

다른 진보의 행렬로 작업하고 싶습니다. – Martin

+0

좀 더 구체적으로 기재 할 수 있습니까? 나는 그것을 바꾸어야하는 일반적인 행렬 연산이 있다고 상상할 수 없다. – kangshiyin

답변

0

외부 보폭은 데이터 저장과 관련된 매개 변수입니다. 보다 보편적으로 사용되는 이름은 선행 차원입니다. 여기서 몇 가지 설명을 찾을 수 있습니다. 기존의 매트릭스 기본적

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 

당신은 또한 matmap1를 복사 할 때 외부 보폭이 변경 볼 수있을 것입니다. 희망 사항은 스트라이드가 무엇인지 더 잘 볼 수 있기를 바랍니다.

실제로 원래 코드에서 Map을 잘못 사용하고 있습니다. Map()Matrix mat으로 복사하면 안됩니다. 그 이유는 mat의 보폭을 인쇄 할 때 항상 4입니다. 불필요한 데이터 복사를 제거하고 보폭을 map1/map2으로 인쇄하면됩니다.

+0

행렬의 외곽을 인쇄하는 방법은 무엇입니까? – Martin

+0

@Madhu 님의 질문에'mat.outerStride(); ' – kangshiyin

+0

mat.outerStride()를 출력 할 때마다 매번 저장 순서에 관계없이 입력 행의 행 수가 제공됩니다. – Martin

관련 문제