簡體   English   中英

轉置矩陣

[英]Transposing a matrix

我想轉置一個矩陣,這是一個非常簡單的任務,但是它不適合我:

更新

我正在轉換第一個矩陣並將其存儲在第二個矩陣中。兩個數組指向相同的結構,我需要兩個數組(目標和源),以便稍后可以顯示它們以進行比較。

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

問題是什么 ?

請幫忙,謝謝!

要轉置矩陣,您需要更改行和列。 因此,您需要使用:

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

請注意i,j的順序如何更改,因為一個矩陣的行是另一個矩陣的列。

順便說一句,您可以寫a->b代替(*a).b 這是訪問結構指針字段的正常方法。

嘗試這個...

   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();

}

我是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++.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM