在C++中转置矩阵
我正在编写一个程序,用分配的内存转置给定的矩阵。该函数对方矩阵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;
}
}
的线条:
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;
}
}
我试过了,但后来得到了一些丑陋的数字:( – Casper 2013-02-13 06:05:50
是从你的输出语句吗?因为你需要确保这些循环类似地索引结果,而不是* row by * col那些应该是* col由* row – pippin1289 2013-02-13 06:18:34
我添加了我的整个转置功能,我测试 – pippin1289 2013-02-13 06:35:21
您正在尝试“就地” 转置矩阵:
((基质+ 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
。如果你愿意,我可以告诉你,你将如何使用矢量功能看
感谢您的输入,我曾多次被告知,使用矢量是好得多,但对于这个问题我需要使用这个概念:( – Casper 2013-02-13 06:09:49
'new'在失败时会抛出异常。如果你希望它在失败时返回'null',可以使用'new(nothrow)'(尽管这很奇怪)。 – 2013-02-13 08:08:05