转置矩阵

时间:2010-05-09 23:14:34

标签: c matrix transpose

我想转置一个矩阵,这是一个非常简单的任务,但它不能与我合作:

更新

我正在调换第一个矩阵和    将它存储在第二个  他们俩    数组指向相同的结构 一世    需要两个数组(目标和源)    所以我可以稍后再显示它们    比较。

struct testing{
  int colmat1;
  int rowmat1;
  float mat[64][64];
};

int testtranspose(testing *test,testing *test2){
  int i,j;
  test2->colmat1 = test->rowmat1;
  test2->rowmat1 = test->colmat1
  for(i=0;i<test->rowmat1;i++){
    for(j=0;j<test->colmat1;j++){
      test2->mat[i][j] = test->mat[i][j];
    }
    printf("\n");
  }
}

我认为这是正确的方法,但显然对于矩阵如:

1 2
3 4
5 6
7 8

我明白了:

1 2 0 0
3 4 0 0

有什么问题?

请帮忙, 谢谢!

3 个答案:

答案 0 :(得分:4)

要转置矩阵,您需要更改行和列。所以你需要使用:

targetMatrix[i][j] = sourceMatrix[j][i];

注意i,j的顺序是如何改变的,因为一个矩阵的行是另一个列。

顺便说一下,您可以写(*a).b而不是a->b。这是访问结构指针字段的常规方法。

答案 1 :(得分:2)

试试这个......

   struct testing{
  int colmat;
  int rowmat;
  float mat[64][64];
};

int testtranspose(testing *test,testing *test2){
  int i,j;
  test2->colmat = test->rowmat;
  test2->rowmat = test->colmat;
  for(i=0;i<test->rowmat;i++){
    for(j=0;j<test->colmat;j++){
      test2->mat[j][i] = test->mat[i][j];
    }
  }
  return 0;
}
int printmat(testing* mat)
{
    for(int i=0;i<mat->rowmat;i++)
    {
        printf("\n");
        for(int j=0;j<mat->colmat;j++)
            printf(("  %f"),mat->mat[i][j]);
    }
    return 0;
}

            // 2
// main.cpp
int _tmain(int argc, _TCHAR* argv[])
{
    testing mat1, mat2;
    memset(&mat1,0,sizeof(testing));
    memset(&mat2,0,sizeof(testing));
    mat1.colmat =2;
    mat1.rowmat =3;
    for(int i=0;i<mat1.rowmat;i++)
    {
        for(int j=0;j<mat1.colmat;j++)
            mat1.mat[i][j] = (float)rand();
    }
    printmat(&mat1);
    testtranspose(&mat1,&mat2);
    printmat(&mat2);
    getchar();

}

答案 2 :(得分:0)

我是C / C ++的新手(第3天左右:))我遇到了同样的问题。我的方法略有不同,因为我认为有一个能够返回转置矩阵的函数会很好。不幸的是,正如我发现的那样,你不能返回一个数组,也不能将数组传递给C ++中的函数(更不用说双数组)了,但你可以传递/返回一个类似于数组的指针。所以这就是我所做的:

int * matrix_transpose(int * A, int A_rows, int A_cols){
    int * B;
    int B_rows, B_cols;
    B_rows = A_cols; B_cols= A_rows;
    B = new int [B_rows*B_cols];
    for(int i=0;i<B_rows;i++){
        for(int j=0;j<B_cols;j++){
            B[i*B_cols+j]=A[j*A_cols+i];
        }
    }
    return B;
};

诀窍在于动态数组。我使用A_rows和B_rows作为单独的名称(您只能使用行和列),以便在阅读代码时减少错综复杂的问题并减少混淆。

B = new int [rows*cols] // This is cool in C++.