1

我想转置一个矩阵,这是一项非常简单的任务,但它不适用于我:

更新

我正在转置第一个矩阵并将其存储在第二个矩阵中。两个数组指向相同的结构,我需要两个数组(目标和源),以便稍后显示它们以进行比较。

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

问题是什么 ?

请帮忙,谢谢!

4

3 回答 3

4

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

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

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

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

于 2010-05-09T23:18:48.410 回答
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();

}
于 2010-05-09T23:41:04.543 回答
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 作为单独的名称(您只能使用 rows 和 cols),以便在阅读代码时减少问题的复杂性和混乱度。

B = new int [rows*cols] // This is cool in C++.
于 2015-02-28T14:44:43.423 回答