1

行列を転置したいのですが、それは非常に簡単な作業ですが、私とはうまくいきません:

アップデート

最初の行列を転置し、2 つ目の行列に格納します 2 つの配列は同じ構造を指します 後で比較のために表示できるように、2 つの配列 (ターゲットとソース) が必要です。

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 に答える