2013-02-13 129 views
2

我正在编写一个程序,用分配的内存转置给定的矩阵。该函数对方矩阵NxN(rows == cols)起作用,但与MxN矩阵(行!= cols)碰撞。请帮助在C++中转置矩阵

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)'(尽管这很奇怪)。 – 2013-02-13 08:08:05

回答

5

的线条:

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

是问题。问题是矩阵是由我然后j索引的,而不是j然后我喜欢你在while循环中的第二行和第三行。图像矩阵是一个2×3的矩阵,然后你尝试执行矩阵[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]; 

然后你就可以像下面的输出,或删除矩阵和重新分配矩阵是导致如你所愿。我的整个转功能成为了下面的代码(ROW和COL不需要指针为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 2013-02-13 06:05:50

+0

是从你的输出语句吗?因为你需要确保这些循环类似地索引结果,而不是* row by * col那些应该是* col由* row – pippin1289 2013-02-13 06:18:34

+0

我添加了我的整个转置功能,我测试 – pippin1289 2013-02-13 06:35:21

1

您正在尝试“就地” 转置矩阵:

(基质+ I)+ J)= (基质+ J)+ I);

你不应该这样做。如果列数大于分配给matrix的行数,则您将读取和写入未分配的内存。

恕我直言,将整个矩阵存储在连续内存中会更好。不是在不同的部分。这样的代码是这样的:

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 2013-02-13 06:09:49