我试图找到具有
rows
行和 cols
列的给定矩阵 A 的转置。
我的尝试:
void GetTranspose(int* a, int rows, int cols, int* tr)
{
for (int i = 0; i < cols; i++)
{
for (int j = 0; j < rows; j++)
{
tr[i * cols + j] = a[j * rows + i];
}
}
}
A 的转置有
cols
行和 rows
列。这就是为什么我们想要 tr[i][j]=a[j][i]。我不明白我的错误在哪里。也许在矩阵线性化的某个地方以及我设置 tr[i][j] 的地方。
这就是我们调用和使用该函数的方式:
int a[4][3] = {
{1, 2, 3},
{2, 3, 5},
{7, 7, 7},
{4, 9, 11}
};
int tr[3][4];
GetTranspose(&a[0][0], 4, 3, &tr[0][0]);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
cout << tr[i][j] << " ";
}
cout << endl;
}
我不明白为什么结果是:
问题在于您在
GetTranspose
函数中计算转置矩阵索引的方式。正确的计算应该是 tr[i * rows + j]
而不是 tr[i * cols + j]
。
这是更正后的代码:
#include <iostream>
using namespace std;
void GetTranspose(int* a, int rows, int cols, int* tr)
{
for (int i = 0; i < cols; i++)
{
for (int j = 0; j < rows; j++)
{
tr[i * rows + j] = a[j * cols + i]; // Corrected index calculation
}
}
}
int a[4][3] =
{
{1, 2, 3},
{2, 3, 5},
{7, 7, 7},
{4, 9, 11}
};
int main()
{
int tr[3][4];
GetTranspose(&a[0][0], 4, 3, &tr[0][0]);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
cout << tr[i][j] << " ";
}
cout << endl;
}
return 0;
}
您提供的代码,不正确的索引导致元素从原始矩阵到转置矩阵的映射不正确。
进行此更改后,您的代码应该可以正常工作,并且您将获得预期的矩阵转置
a
。
现在,结果应该是矩阵的正确转置
a
。