[英]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.