3

我正在编写一个程序来使用分配的内存转置给定的矩阵。该函数与方阵 NxN (rows==cols) 完美配合,但它与 MxN 矩阵 (rows != cols) 一起崩溃。请帮忙

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

2 回答 2

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

是问题。问题是矩阵由 i 然后 j 索引,而不是 j 然后 i 就像你在 while 循环的第二行和第三行中所做的那样。矩阵是 2x3 矩阵的图像,然后您尝试执行 matrix[2][3] = matrix[3][2],但 matrix[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;
  }
}
于 2013-02-13T05:34:43.023 回答
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. 如果你愿意,我可以告诉你,你将如何使用矢量

于 2013-02-13T05:39:11.033 回答