2013-07-16 4 views
0
#include<iostream> 
using namespace std; 


void transpose(const int input[2][3], int (&output)[3][2]){ 
    for(int i=0; i<2; ++i) { 
     for(int j=0; j<3 ; ++j) { 
      output [j][i] = input [i][j]; 
     } 
    } 
} 

void printMultiArray(const int multi[2][3], const int len){ 
    for (int row=0; row<2; row++){ 
     for (int col=0; col<3; col++){ 
      cout << multi[row][col] << " " ; 
     }        
     cout << endl;       
    }            
} 


int main(){ 

    int multi[2][3] = {{1, 2, 3}, {7, 8, 9}}; 
    int empty[3][2]; 


    printMultiArray(multi, 6); 
    cout << "... space line ..." << endl; 

    transpose(multi, empty); 
    printMultiArray(empty, 6); 


    return 0; 
} 

전치 ...하지만 컴파일하고 실패하지 않는다 : 나는 문제가 있지만 무엇인지 확실하지 않다나는 2 × 3 배열을 tranpose하기 위해 위의 코드를 배열

6-3-transposeArray.cpp: In function ‘int main()’: 
6-3-transposeArray.cpp:33: error: cannot convert ‘int (*)[2]’ to ‘const int (*)[3]’ for argument ‘1’ to ‘void printMultiArray(const int (*)[3], int)’ 

. 그것은 transpose()하지만 printMultiArray() 배열에 동일한 방식으로 전달되는 아무 문제가 것 같다 첫 번째 arg 불평하는 것 같다.

둘째로 이것을 구현하는 일반적인 방법이 있습니까? (예를 들어, 2 × 3, 2 × 4와 2X5 배열에 걸릴과 각 전치 반환 할 수 일반적인 FUNC) 벡터를 포함하는 클래스를 만듭니다 기본적인 질문의

비트하지만 감사 어떤 도움 :)

+0

'std :: vector > '같은 것을 사용하지 않는 이유는 무엇입니까? 또한 트랜스 포즈하는 가장 간단한 방법은'(i, j)'를 뒤집는 것입니다 : http://stackoverflow.com/questions/16737298/what-is-the-fastest-way-to-transpose-a-matrix-in-c –

+0

정말로, 정말로 *, *** *** 정말 이런 식으로 2 차 텐서를 저장하고 싶지 않습니다. 이는 잘 설계된 클래스 (내부 메모리 용도로'std :: vector '를 사용할 수있는)를위한 작업입니다. 아직 수업을 모른다면 책을 읽으십시오. – Zeta

+0

부스트 uBlas가 옵션입니까?이 [질문] (http://stackoverflow.com/questions/4097153/how-to-transpose-matrix-using-ublas)을 참조하십시오. – dwxw

답변

3

것 같다 구현 MyMatrix 클래스입니다 newMatoldMat 뭔가 같은

newMat = oldMat.Transpose() 

이 첫번째 인수에 대해 불평 할 수 transpose()

아니요, 오류는 분명히 문제가 printMultiArray의 첫 번째 인수와 함께 있다고 말합니다. 당신은 3x2 배열을 전달하고 있으며이 함수는 2x3 배열을 위해 하드 코딩되어 있습니다.

둘째로 이것을 구현하는 더 일반적인 방법이 있습니까?

예; 당신은 크기를 지정하는 정수 템플릿 매개 변수를 사용할 수 있습니다

template <size_t N, size_t M> 
void transpose(const int (&input)[N][M], int (&output)[M][N]) { 
    for (size_t i = 0; i < N; ++i) { 
     for (size_t j = 0; j < M; ++j) { 
      output[j][i] = input[i][j]; 
     } 
    } 
} 

올바른 템플릿 특수화

는 함수 인수에서 추론 할 수 있습니다

transpose(multi, empty); // Automatically selects N=2, M=3. 

마찬가지로, 당신이 당신의 오류를 수정하는 일반적인 printMultiArray을 구현할 수 있습니다.

+0

Argh! ... 정말 바보 같은 실수 - 미안 해요 : ( – mbbxedh2

+0

제네릭 솔루션도 고마워요. – mbbxedh2

0

합니다. 생성자에서 행렬의 x 및 y 크기를 전달하고 벡터의 크기를 x * y로 조정합니다. 사용자가 액세스하고자하는 x, y 좌표를 취하는 get/set 함수 (또는 연산자 [])를 만듭니다. 또한 클래스에 "전치 된"부울 플래그가 있습니다. 플래그가 true이면 x와 y를 바꾼 다음 vec [x + y * sizex]를 반환합니다. 이제 배열을 조 변경하면 복사 할 필요가 없습니다. 그냥 국기를 뒤집어 라.

0

std::vectors을 사용하여 구현할 수 있으며 더 읽기 쉽고 관리하기 쉽습니다.

그러나 일반적인 내용을 원하면 Eigen을 사용하십시오. 자신을 구현하는 것을 주장하고 일반 무언가를 원한다면 나는 이것을 위해 당신을 위해 클래스를 만들 것입니다. 나는 디자인에 너무 많이 가지 않을 것이다 그러나 당신이

관련 문제