前言
想要了解更多矩陣的知識參考《線性代數》。
二維數組,矩陣問題,總結一下。
這裏一如既往的使用隨機數組,免得一直用鍵盤輸入冗長的數據,避免了麻煩。
一、實現矩陣轉置
1.原理
什麼是矩陣轉置?如下圖。
就是把矩陣的行轉換爲列,第n行變成了第n列。
在編程語言中,
矩陣轉置的核心是a[i][j]=b[j][i]
2.代碼
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int a[3][4],b[4][3];
int i,j;
srand((int)time(NULL));
for(i=0;i<3;i++)
for(j=0;j<4;j++)
a[i][j]=(int)(55+45*rand()/RAND_MAX);
printf("The matrix a:\n");
for(i=0;i<3;i++){
for(j=0;j<4;j++)
printf("%5d",a[i][j]);
printf("\n");
}
for(i=0;i<3;i++)
for(j=0;j<4;j++)
b[j][i]=a[i][j];
printf("The matrix b:\n");
for(i=0;i<4;i++){
for(j=0;j<3;j++)
printf("%5d",b[i][j]);
printf("\n");
}
}
2.代碼分析
看過我之前的博客的讀者,應該會對隨機數組比較瞭解。
#include<stdlib.h>
#include<time.h>
等預處理命令是實現隨機數組的必要指令。
srand((int)time(0))是種下隨機數種子,至於爲什麼是裏面的參數((int)time(0))的由來感興趣的讀者可以查閱相關資料,目前只需要會使用就行。
①for(i=0;i<3;i++)
for(j=0;j<4;j++)
a[i][j]=(int)(55+45*rand()/RAND_MAX);
printf(“The matrix a:\n”);
//這裏對二位數組a賦隨機的值並打印。
②for(i=0;i<3;i++)
for(j=0;j<4;j++)
b[j][i]=a[i][j];
//實現矩陣轉置的核心代碼,要把行列互換,我們只需把下標 i、j 互換。
③for(i=0;i<4;i++){
for(j=0;j<3;j++)
printf("%5d",b[i][j]);
printf("\n");
}
//打印轉置後的二維數組b
二、判斷是否爲對稱矩陣
1.對稱矩陣概述及其判斷
什麼是對稱矩陣?如圖所示。
在二維數組a中,a[i][j]=a[j][i]。
2.代碼
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int a[5][5];
int i,j;
int flag=1;
printf("Enter the data for the matrix:\n");
for(i=0;i<5;i++)
for(j=0;j<5;j++)
a[i][j]=(int)(10+90*rand()/RAND_MAX);
printf("The matrix is:\n");
for(i=0;i<5;i++){
for(j=0;j<5;j++)
printf("%5d",a[i][j]);
printf("\n");
}
i=0;
while((i<5)&&(flag==1)){
j=0;
while((j<i)&&(flag==1)){
if(a[i][j]!=a[j][i]) flag=0;
j++;
}
i++;
}
if(flag==1) printf("The matrix is symmetrical!");
else printf("The matrix isn't symmetrical!");
}
3.代碼分析
①首先給二維數組賦隨機值,並打印二維數組,可參考前文或前面的博客,不過多贅述。
②直接進入最核心的代碼:
i=0;
while((i<5)&&(flag==1)){
j=0;
while((j<i)&&(flag==1)){
if(a[i][j]!=a[j][i]) flag=0;
j++;
}
i++;
}
if(flag==1) printf("The matrix is symmetrical!");
else printf("The matrix isn't symmetrical!");
這是判斷是否是對稱矩陣的代碼,裏面摻和了許多小白不知道的新元素,以前都是用for循環,這裏是用while循環,還多了flag1。**爲什麼要用flag1和while循環?** while循環和普通for循環的區別是什麼?
仔細想想就能發現,我們在發現了a[i][j]!=a[j][i]後,flag=0,與條件中flag==1相矛盾,就會直接跳出循環,避免了後續的遍歷,節省了執行時間。
如果要用for循環實現,很多人可能是這樣想的:
for(i=0;i<5;i++)
for(j=0;j<i;j++)
if(a[i][j]!=a[j][i]) flag=0;
if(flag==1) printf("The matrix is symmetrical!");
else printf("The matrix isn't symmetrical!");
這種實現方法是可行的 ,從代碼量上來看比while循環更加簡單。
但是,我們說它的執行時間要更久一點。即使找到了a[i][j]!=a[j][i],使flag=0,由於for循環中並沒有限制flag==1,就無法馬上跳出循環,它就會知道兩個嵌套for循環全部遍歷完再進行對稱矩陣的判斷。
所以,while循環和for循環的利用和區別要加以仔細區分。