C語言兩種方式實現矩陣的轉置


#include"stdio.h"
typedef struct{
int i,j;
int v;
}Triple;
typedef struct{
Triple date[1000];
int mu,nu,tu;//hang、lie
}TSMatrix;

void Trans(TSMatrix &T,TSMatrix &M){//將來會對M的值進行修改,而不會對T的值進行修改,所以M需要傳遞地址
M.mu=T.nu;
M.nu=T.mu;
M.tu=T.tu;
int l=1;
for(int q=1;q<T.nu+1;q++)
for(int p=1;p<T.tu+1;p++){
if(T.date[p].j==q){
M.date[l].i=T.date[p].j;
M.date[l].j=T.date[p].i;
M.date[l].v=T.date[p].v;
l++;
}    
}
printf("轉置后\n");
printf("i j v\n");
for(int k=1;k<M.tu+1;k++){
printf("%d %d %d\n",M.date[k].i,M.date[k].j,M.date[k].v);
}
}
int main(){
TSMatrix T,M;
T.date[1].i=1;T.date[1].j=2;T.date[1].v=12;T.date[2].i=1;T.date[2].j=3;T.date[2].v=9;T.date[3].i=3;T.date[3].j=1;T.date[3].v=-3;T.date[4].i=3;T.date[4].j=6;T.date[4].v=14;T.date[5].i=4;T.date[5].j=3;T.date[5].v=24;T.date[6].i=5;T.date[6].j=2;T.date[6].v=18;T.date[7].i=6;T.date[7].j=1;T.date[7].v=15;T.date[8].i=6;T.date[8].j=4;T.date[8].v=-7;
T.tu=8;
T.nu=6;
T.mu=6;
printf("轉置前\n");
printf("i j v\n");
//printf("%d",T.tu);
for(int k=1;k<T.tu+1;k++){
printf("%d %d %d\n",T.date[k].i,T.date[k].j,T.date[k].v);
}
Trans(T,M);
printf(" ");
return 0;
}

 

分析:在矩陣的轉置中,是將T矩陣的列轉為M矩陣的行,在M矩陣中,是以行順序進行存儲,所以,在轉置時以T矩陣的列順序遍歷,找出每個T.date[p].j==q,p即在T矩陣中的位置。

改算法的時間復雜度是nu*tu,一般矩陣轉置的算法復雜的為mu*nu,所以該算法僅適於tu<<mu*nu(別問我為什么不是tu<mu,我不知道,書上就是這樣寫的,歡迎指點)

快速轉置:

#include"stdio.h"
#define MAX 1000
typedef struct{
int i,j;
int v;
}Triple;
typedef struct{
Triple date[MAX];
int mu,nu,tu;//hang、lie
}TSMatrix;


void Trans(TSMatrix &T,TSMatrix &M,int col){//將來會對M的值進行修改,而不會對T的值進行修改,所以M需要傳遞地址
//int num[col];  //error C2057: expected constant expression 在定義num[col]時報錯,查得col是個變量,一直要到運行期才被分配內存,才會有值,所以編譯期的時候它還沒有值,故而編譯時會出錯。
//int cpot[col];//所以設置宏,但是這明顯不是最好的辦法,如果有更好的方法請大家指點
int q=0;
int num[MAX];
int cpot[MAX];
M.mu=T.nu;
M.nu=T.mu;
M.tu=T.tu;
if(M.tu){
for(int col=1;col<T.mu+1;++col) num[col]=0;
for(int t=1;t<M.tu+1;++t) ++num[T.date[t].j];
cpot[1]=1;
for(int co=2;co<T.mu+1;++co) cpot[co]=cpot[co-1]+num[co-1];
for(int p=1;p<T.tu+1;++p){
col=T.date[p].j;
q=cpot[col];
M.date[q].i=T.date[p].j;
M.date[q].j=T.date[p].i;
M.date[q].v=T.date[p].v;
++cpot[col];
}
}
printf("轉置后\n");
printf("i j v\n");
for(int k=1;k<M.tu+1;k++){
printf("%d %d %d\n",M.date[k].i,M.date[k].j,M.date[k].v);
}
}
int main(){
TSMatrix T,M;
T.date[1].i=1;T.date[1].j=2;T.date[1].v=12;T.date[2].i=1;T.date[2].j=3;T.date[2].v=9;T.date[3].i=3;T.date[3].j=1;T.date[3].v=-3;T.date[4].i=3;T.date[4].j=6;T.date[4].v=14;T.date[5].i=4;T.date[5].j=3;T.date[5].v=24;T.date[6].i=5;T.date[6].j=2;T.date[6].v=18;T.date[7].i=6;T.date[7].j=1;T.date[7].v=15;T.date[8].i=6;T.date[8].j=4;T.date[8].v=-7;
T.tu=8;
T.nu=6;
T.mu=6;
printf("轉置前\n");
printf("i j v\n");
//printf("%d",T.tu);
for(int k=1;k<T.tu+1;k++){
printf("%d %d %d\n",T.date[k].i,T.date[k].j,T.date[k].v);
}
Trans(T,M,T.nu);
return 0;
}
分析:在轉置中有亮點關鍵1、cpot[1]=1;cpot[co]=cpot[co-1]+num[co-1];這個表示的是各個行列中兩個數組的關系,2、++cpot[col];竊以為這個才是整個代碼的靈魂,cpot[col]表示col列第一個非零元在M矩陣中的位置,++cpot[col]則表示如果該列不止一個非零元,那++cpot[col]表示該列下個非零元的位置,如果沒有下個非零元,則++cpot[col]不再使用。

該算法的時間復雜度是mu*nu


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM