我正在编写一个程序来使用分配的内存来转置给定的矩阵。该函数与方矩阵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;
}
}
答案 0 :(得分: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然后我喜欢你在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];
然后您可以输出如下所示,或删除矩阵并根据需要重新分配矩阵。我的整个转置函数变成了以下代码(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;
}
}
答案 1 :(得分:1)
您正试图将“矩阵”移位到位:
((matrix + i)+ j)= ((matrix + 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
的最佳方式。如果你愿意,我可以告诉你,你将如何看待矢量