C++ 使用c+变换矩阵+;

C++ 使用c+变换矩阵+;,c++,pointers,matrix,C++,Pointers,Matrix,我想写一个程序来转置一个n*n矩阵,但是代码输出了有线的东西。它没有转换矩阵。假设我想转置一个矩阵{(1,2,3),{4,5,6),(7,8,9)},结果基本上与原始矩阵相同,有一些我不知道的奇怪行为 #include<iostream> #include<iomanip> using namespace std; void transpose(int* p, int n); #define M 20 int main() { int a[M][M]; i

我想写一个程序来转置一个n*n矩阵,但是代码输出了有线的东西。它没有转换矩阵。假设我想转置一个矩阵{(1,2,3),{4,5,6),(7,8,9)},结果基本上与原始矩阵相同,有一些我不知道的奇怪行为

#include<iostream>
#include<iomanip>
using namespace std;
void transpose(int* p, int n);
#define M 20
int main()
{
    int a[M][M];
    int n;      
    int* p;
    cout << "The size of a matrix is: ";
    cin >> n;
    cout << "Input a matrix: " << endl;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin >> a[i][j];
    p = &a[0][0];
    transpose(p, n);
    cout << "Now, the matrix is: " << endl;
    for (int i = 0; i < n; i++)
    {

        for (int j = 0; j < n; j++)
        {
            cout << setw(4) << a[i][j];
        }
        cout << endl;
    }
    return 0;
}

void transpose(int* p, int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = i; j < n; j++)
        {
            int temp = *(p + i * n + j);
            *(p + i * n + j) = *(p + j * n + i);
            *(p + j * n + i) = temp;
        }
    }
}
#包括
#包括
使用名称空间std;
无效转置(int*p,int-n);
#定义M20
int main()
{
int a[M][M];
int n;
int*p;
cout>n;
couta[i][j];
p=&a[0][0];
转置(p,n);
cout你应该打电话:

transpose(p, M);
而不是:

transpose(p, n);
虽然您的矩阵是
3x3
,但您为
20x20
矩阵保留了内存。因此,下一行是
20
int
s(两行偏移之间的内存间隔称为跨距)

为了加快流程,您可以实现三个参数变量:

void transpose(int* p, int m, int n) {
    for (int i = 0; i < n; i++) {
        for (int j = i; j < n; j++) {
            int temp = *(p + i * m + j);
            *(p + i * m + j) = *(p + j * m + i);
            *(p + j * m + i) = temp;
        }
    }
}

但老实说,我认为你在内存中定义矩阵的方式以及转置算法可以改进。你的
转置
方法并不是真正的缓存友好型方法。对于快速计算,我建议使用该软件包。这种算法分块工作,可以显著减少缓存故障的数量,并利用multithre也可以使用步幅调整来提高性能。有关如何有效转置矩阵的更多详细信息,请参阅。

对,换句话说,
transpose()
中使用的“步幅”是错误的。三个参数
transpose()
是一个很好的解决方案;一个很好的解决方案是首先只存储
n*n
值。@JohnZwinck:请参阅更新的答案,但老实说,最好使用软件包,我所在部门的许多研究人员都为这类软件包做出了重要贡献,他们为密集矩阵和稀疏矩阵设计的算法都非常优化D.自写算法会打败他们的机会很小。谢谢你们的详细解释,谢谢大家。我在这里没有看到任何C++代码。我只看到C代码。如果这是C++代码,我希望看到STD::向量,而不是普通的,花园式的,二维数组。@ SamVarshavchik不是有效C,但它是有效的C++。@SamVarshavchik cout,endl,
transpose(p, M, n);