2013-02-13 3 views
2

할당 된 메모리를 사용하여 주어진 행렬을 조 변경하는 프로그램을 작성 중입니다. 이 함수는 정사각형 행렬 NxN (행 == cols)과 완벽하게 작동하지만 MxN 행렬 (행! = cols)과 충돌합니다. C++로 행렬 전치시키기

for (int i = 0; i<*row; i++) 
{ 
    for (int j = i+1; j<*col; j++) 
    { 
    int temp = *(*(matrix + i) + j); 
    *(*(matrix + i) + j) = *(*(matrix + j) + i); 
    *(*(matrix + j) + i) = temp; 
    } 
} 

문제입니다

void transpose(int **matrix, int *row, int *col) 
{ 
    // dynamically allocate an array 
    int **result; 
    result = new int *[*col]; //creates a new array of pointers to int objects 
    // check for error 
    if (result == NULL) 
    { 
     cout << "Error allocating array"; 
     exit(1); 
    } 
    for (int count = 0; count < *col; count++) 
    { 
     *(result + count) = new int[*row]; 
    } 

    // transposing 
    for (int i = 0; i<*row; i++) 
    { 
     for (int j = i+1; j<*col; j++) 
     { 
     int temp = *(*(matrix + i) + j); 
     *(*(matrix + i) + j) = *(*(matrix + j) + i); 
     *(*(matrix + j) + i) = temp; 
     } 
    } 

    for (int i = 0; i<*row; i++) 
    { 
     for (int j = 0; j<*col; j++) 
     { 
      *(*(result + i) + j) = *(*(matrix + i) + j); 
      cout << *(*(result + i) + j) << "\t"; 
     } 
     cout << endl; 
    } 
} 
+0

'new'는 실패시 예외를 던집니다. 실패 할 때'null '을 반환하기를 원하면'new (nothrow)'를 사용하라. –

답변

5

선을 도와주세요. 문제는 행렬 색인이 i, j, j가 아니라 while 루프의 두 번째 및 세 번째 행 에서처럼 나타나는 것입니다. 행렬이 2x3 행렬 인 이미지는 행렬 [2] [3] = 행렬 [3] [2]을 수행하려고 시도하지만 행렬 [3] [2]는 존재하지 않습니다.

그것은 단순히이 루프에서 직접 결과를 초기화 가야하는 것이 가장 좋습니다 :

for (int i = 0; i<*row; i++) 
    for (int j = 0; j<*col; j++) 
    result[j][i] = matrix[i][j]; 

는 그런 다음, 매트릭스를 다음과 같은 출력을 삭제하거나 원하는대로 결과로 매트릭스를 재 할당 할 수 있습니다. 내 전체 전치 함수는 다음 코드 (행 안부 가치가 잘있다가 패스를 int로 포인터 일 필요는 없다 또한 더 좋은 스타일이기 때문에 행렬 배열 첨자를 사용한다 접근.)되었다 :

void transpose(int **matrix, int row, int col) 
{ 
    // dynamically allocate an array 
    int **result; 
    result = new int *[col]; //creates a new array of pointers to int objects 
    for (int i = 0; i < col; i++) 
    result[i] = new int[row]; 

    // transposing 
    for (int i = 0; i<row; i++) 
    for (int j = 0; j<col; j++) 
    result[j][i] = matrix[i][j]; 

    //output resulting matrix 
    for (int i = 0; i<col; i++) { 
    for (int j = 0; j<row; j++) 
    cout << result[i][j] << "\t"; 
    cout << endl; 
    } 
} 
+0

나는 시도했지만 추한 숫자가있어 : ( – Casper

+0

출력 진술에서 그런 건가요? 당신은 그 루프가 * col * 행에 의해 * 행 대신에 비슷한 인덱스 결과를 확인해야하기 때문에 * 행에 의해 – pippin1289

+0

내 추가 내가 테스트 한 전체 전치 함수 – pippin1289

1

당신이하려고하는 "대신에"매트릭스 트랜스 :

( (매트릭스 + I) + J) = ( (매트릭스 + J) + I);

이렇게하면 안됩니다. 열 개수가 matrix에 할당 된 행 수보다 많으면 할당되지 않은 메모리를 읽고 쓰게됩니다.

IMHO, 전체 메모리를 연속 메모리에 저장하는 것이 좋습니다. 다른 부분에는 없습니다. 이러한 방식으로 코드는 다음과 같을 것이다 :이 할당

void transpose(int *matrix, int row, int col) 
{ 
    for (int i = 0; i < row; i++) 
    { 
     for (int j = i + 1; j < col; j++) 
     { 
      int temp = matrix[ i * col + j ]; 
      matrix[ i * col + j ] = matrix[ j * col + i ]; 
      matrix[ j * col + i ] = temp; 
     } 
    } 
} 

유일하게 마이너스를, 당신이 matrix[ i ][ j ]matrix[ i + col + j ] 같은 요소를 해결할 수 없다. 흑자는 1) 할당하기 쉬운/할당 해제 메모리 (단지 matrix = new int[ col * row ]delete [] matrix) 때문에 지속적으로 그들의 위치) 끝에

의 요소 (2) 조금 빠른 액세스, 나는 그것이 될 것이라고 생각 가장 좋은 방법은 std::vector입니다. 원하는 경우, 내가 보여줄 수있는, 당신은 벡터로 어떻게 보이게 할 것인가

+0

여러분의 의견에 감사드립니다. 저는 벡터를 사용하는 것이 훨씬 낫다는 말을 여러 번 들었지만이 문제에 대해서는이 개념을 사용해야합니다. – Casper