在C++中转置矩阵

Cas*_*per 3 c++ transpose matrix

我正在编写一个程序来使用分配的内存来转置给定的矩阵.该函数与方矩阵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;
    }
}
Run Code Online (Sandbox Code Playgroud)

pip*_*289 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;
   }
}
Run Code Online (Sandbox Code Playgroud)

是问题.问题是矩阵是由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];
Run Code Online (Sandbox Code Playgroud)

然后你可以输出如下,或删除矩阵并重新分配矩阵作为你想要的结果.我的整个转置函数变成了以下代码(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;
  }
}
Run Code Online (Sandbox Code Playgroud)