C語言 二維數組 矩陣問題 如何判斷對稱矩陣 矩陣如何轉置

前言

想要了解更多矩陣的知識參考《線性代數》。
二維數組,矩陣問題,總結一下。
這裏一如既往的使用隨機數組,免得一直用鍵盤輸入冗長的數據,避免了麻煩。

一、實現矩陣轉置

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循環的利用和區別要加以仔細區分。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章