c語言實現矩陣的相關操作參考模板_第1頁
c語言實現矩陣的相關操作參考模板_第2頁
c語言實現矩陣的相關操作參考模板_第3頁
c語言實現矩陣的相關操作參考模板_第4頁
c語言實現矩陣的相關操作參考模板_第5頁
已閱讀5頁,還剩22頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、算法分析與設計課程論文通過C語言實現矩陣的相關操作1 / 271 摘要本文在Microsoft Visual Studio 2010的編譯環境下,通過C語言進行一些矩陣的基本操作,包括矩陣的設置,加減乘除,數乘運算。求矩陣的逆等操作。關鍵詞矩陣 C語言 逆矩陣2 正文1. 引言矩陣的相關知識只是是高等數學的基礎,但是其龐大的運算量和紛繁的步驟讓人卻步。雖然有Matlab等軟件可以實現矩陣的相關操作,但是我校一些專業并不學習數學實驗,故通過C語言實現矩陣的操作也是一種可行的方法,本文列舉的了一些矩陣的加減乘除等基本運算規則,還有對矩陣進行轉置,也有矩陣求逆的相關操作。同時,還介紹了行列式的計算,

2、通過運行該程序,可以大大簡化行列式的計算量。2. 算法分析矩陣的初始化相關概念在數學中,矩陣(Matrix)是一個按照長方陣列排列的復數或實數集合,最早來自于方程組的系數及常數所構成的方陣。這一概念由19世紀英國數學家凱利首先提出。矩陣是高等代數學中的常見工具,也常見于統計分析等應用數學學科中。在物理學中,矩陣于電路學、力學、光學和量子物理中都有應用;計算機科學中,三維動畫制作也需要用到矩陣。 矩陣的運算是數值分析領域的重要問題。將矩陣分解為簡單矩陣的組合可以在理論和實際應用上簡化矩陣的運算。對一些應用廣泛而形式特殊的矩陣,例如稀疏矩陣和準對角矩陣,有特定的快速運算算法。理論分析 在C語言中,

3、可以使用二維數組來描繪一個矩陣。值得注意的是,在二維數組中,必須標明列數,否則編譯器就會報錯。故二維極其多維數組使用時要注意數組下標。代碼實現#include <stdio.h>int main()int juzheng 100100;int i , j , a , b ;printf("請輸入矩陣的行數a 列數b n") ;scanf ("%d %d",&a,&b);for (i = 0;i < a ;i+)for (j = 0;j < b ;j+)scanf ("%d",&juzhe

4、ngij);printf ("你所輸入的矩陣是:n");for (i = 0;i < a ;i+)for (j = 0;j < b ;j+)printf("%d ",juzhengij);printf ("n");return 0;矩陣的相加相關概念加法矩陣的加法滿足下列運算律(A,B,C都是同型矩陣):A+B=B+AA+B+C=A+(B+C)應該注意的是只有同型矩陣之間才可以進行加法理論分析:矩陣相加就是將兩個矩陣的相同位置的元素相加,相加的值輸出,通過循環語句,可以很好的實現該過程,如果要改成減法的話,就可以改成pri

5、ntf(“%d”,juzhen1ij-juzhen2ij)。這樣就可以實現矩陣的減法。代碼實現#include <stdio.h>int main()int juzheng1 100100,juzheng2100100;int i , j , a , b ;printf("請輸入矩陣的行數a和列數bn") ;scanf ("%d %d",&a,&b);printf("輸入矩陣1n");for (i = 0;i < a ;i+)for (j = 0;j < b ;j+)scanf ("%

6、d",&juzheng1ij);printf("輸入矩陣2n");for (i = 0;i < a ;i+)for (j = 0;j < b ;j+)scanf ("%d",&juzheng2ij);printf ("您所輸入的矩陣1是:n");for (i = 0;i < a ;i+)for (j = 0;j < b ;j+)printf("%d ",juzheng1ij);printf ("n");printf ("n您所輸入的矩陣

7、2是:n");for (i = 0;i < a ;i+)for (j = 0;j < b ;j+)printf("%d ",juzheng2ij);printf ("n");printf ("n您輸出的矩陣是:n");for (i = 0;i < a ;i+)for (j = 0;j < b ;j+)printf("%d ",juzheng1ij+juzheng2ij);printf ("n");return 0;矩陣的數乘相關概念矩陣的數乘滿足以下運算律:矩陣

8、的加減法和矩陣的數乘合稱矩陣的線性運算。理論分析矩陣的數乘,就是把要乘的那個數乘上每一個元素。要想實現矩陣的數乘,只需在每一個元素上乘上那個數就行了。通過對二維數組的遍歷,就可以實現該項功能。代碼實現#include <stdio.h>int main()int juzheng 100100;int i , j , a , b ,u;printf("請輸入矩陣的行數a 列數b n") ;scanf ("%d %d",&a,&b);printf("請輸入需要數乘的那個數un") ;scanf ("%

9、d",&u);for (i = 0;i < a ;i+)for (j = 0;j < b ;j+)scanf ("%d",&juzhengij);printf ("你所輸出的矩陣是:n");for (i = 0;i < a ;i+)for (j = 0;j < b ;j+)printf("%d ",u*juzhengij);printf ("n");return 0;求矩陣中的最大最小值相關概念矩陣中所有元素存在最大最小值,通過在矩陣中的比較大小,就可以找到矩陣中所

10、有元素的最大最小值。理論分析在一個矩陣中,存在最大值與最小值,通過在循環語句中比較,就可以得出一個矩陣中所有元素的最大最小值。通過初始化一個max與min,然后將矩陣中個個元素與其進行比較,就可以得出矩陣中個個元素的最大值與最小值。代碼實現#include <stdio.h>int main()int juzheng 100100;int i , j , a , b , min , max ;max = -100000;min = 100000;printf("請輸入矩陣的行數a 列數b n") ;scanf ("%d %d",&a,

11、&b);for (i = 0;i < a ;i+)for (j = 0;j < b ;j+)scanf ("%d",&juzhengij);for (i = 0;i < a ;i+)for (j = 0;j < b ;j+)if (juzhengij > max)max = juzhengij; if (juzhengij < min)min = juzhengij;printf ("n");printf("max = %d min = %d",max,min);return 0;矩

12、陣的乘法相關概念兩個矩陣的乘法僅當第一個矩陣A的列數和另一個矩陣B的行數相等時才能定義。如A是m×n矩陣和B是n×p矩陣,它們的乘積C是一個m×p矩陣,它的一個元素:并將此乘積記為:.例如:矩陣的乘法滿足以下運算律:結合律:ABC=A(BC)左分配律:(A+B)*C=AC+BC右分配律:A*(B+C)=AC+BC但是矩陣乘法不滿足交換律。理論分析 矩陣乘法必須是a*b的矩陣和b*n的矩陣形式才能相乘,通過矩陣乘法的運算法則,就可以得到新的矩陣。值得注意的是代碼實現#include <stdio.h>int main()int juzheng1 1001

13、00,juzheng2100100;int i , j , a , b , n ,d , k;printf("請輸入矩陣的行數a和列數bn") ;scanf ("%d %d",&a,&b);printf("輸入矩陣1n");for (i = 0;i < a ;i+)for (j = 0;j < b ;j+)scanf ("%d",&juzheng1ij);printf("矩陣2為a行n列,輸入nn");scanf ("%d",&n)

14、;printf("輸入矩陣2:n");for (i = 0;i < b ;i+)for (j = 0;j < n ;j+)scanf ("%d",&juzheng2ij);printf("兩個矩陣的乘積y為:n");for(i = 0;i < a;i+)for(j = 0;j < n;j+)for(d = 0,k = 0;k < n;k+)d += juzheng1ik * juzheng2kj;printf("%d ",d);printf("n");求轉置

15、矩陣把矩陣A的行換成相應的列,得到的新矩陣稱為A的轉置矩陣,記作或A。理論分析 只需要將輸出是行數和列數交換一下就行了,在循環中將輸出結果輸出就可以了。對于數組下標的操作,有時可以很大的降低算法的復雜度。所以對于數組下標操作的小技巧,要留意。代碼實現#include <stdio.h>int main()int juzheng 100100;int i , j , a , b ;printf("請輸入矩陣的行數a列數b n") ;scanf ("%d %d",&a,&b);for (i = 0;i < a ;i+)for

16、 (j = 0;j < b ;j+)scanf ("%d",&juzhengij);printf ("轉置矩陣是:阰n");for (i = 0;i < a ;i+)for (j = 0;j < b ;j+)printf("%d ",juzhengji);printf ("n");return 0;求矩陣的逆設A是數域上的一個n階方陣,若在相同數域上存在另一個n階矩陣B,使得:AB=BA=I。 則我們稱B是A的逆矩陣,而A則被稱為可逆矩陣。理論分析伴隨矩陣法求逆矩陣如果矩陣A可逆,則

17、60; 其中是A的伴隨矩陣。代碼首先求出A的伴隨矩陣,代碼#include<stdio.h>#define N 10int getA(int arcsNN,int n)if(n=1)return arcs00;int ans = 0;int tempNN;int i,j,k;for(i=0;i<n;i+)for(j=0;j<n-1;j+)for(k=0;k<n-1;k+)tempjk = arcsj+1(k>=i)?k+1:k;int t = getA(temp,n-1);if(i%2=0)ans += arcs0i*t;elseans -= ar

18、cs0i*t;return ans;void getAStart(int arcsNN,int n,int ansNN)if(n=1)ans00 = 1;return;int i,j,k,t;int tempNN;for(i=0;i<n;i+)for(j=0;j<n;j+)for(k=0;k<n-1;k+)for(t=0;t<n-1;t+)tempkt = arcsk>=i?k+1:kt>=j?t+1:t;ansji = getA(temp,n-1);if(i+j)%2 = 1)ansji = - ansji;int main() int arcsNN;in

19、t astarNN;int i,j;int n;while(scanf("%d",&n)!=EOF && n)for(i=0;i<n;i+)for(j=0;j<n;j+)scanf("%d",&arcsij);int a = getA(arcs,n);if(a=0)printf("can not transform!n");elsegetAStart(arcs,n,astar);for(i=0;i<n;i+)for(j=0;j<n;j+)printf("%.3lf &q

20、uot;,(double)astarij/a);printf("n");printf("n");return 0;求行列式相關概念一個n階方塊矩陣A的行列式可直觀地定義如下:其中,Sn是集合 1, 2, .,n上置換的全體,即集合 1, 2, .,n到自身上的一一映射(雙射)的全體;表示對Sn全部元素的求和,即對于每個Sn, 在加法算式中出現一次;對每一個滿足1i,jn的數對(i,j),ai, j是矩陣A的第i行第j列的元素。sgn()表示置換Sn的符號差,具體地說,滿足1i<jn但(i) >(j)的有序數對(i,j)稱為的一個逆序

21、。如果的逆序共有偶數個,則sgn()1,如果共有奇數個,則sgn()-1。理論分析輸入一個矩陣,按照行列式的定義展開,通過循環,就可以達到實現最后的目標。行列式的計算是一個復雜的過程,通過編程,可以直接輸入該行列式,就可以輸出其結果,這樣大大減少了運算量,節約了時間。#include<stdio.h>int main() int z , r , s , j , i ; double a2020 , m , k ;m =1.0;printf("請輸入階數:");scanf("%d",&r);printf("請輸入數字?n&qu

22、ot;);for(i=0;i<r;i+)for(j=0;j<r;j+)scanf("%lf",&aij);for(z = 0 ; z < r-1 ; z+)for(i = z ; i < r-1 ; i+)if(azz=0)for(i=z;azz=0;i+)for(j=0;j<r;j+)azj=azj+ai+1j;if(azz!=0)break;k=-ai+1z/azz;for(j=z;j<r;j+)ai+1j=k*(azj)+ai+1j;for(z=0;z<r;z+)m=m*(azz);printf("%f&qu

23、ot;,m);return 0;3. 結論與反思在Microsoft Visual Studio 2010的編譯環境下,通過C語言進行一些矩陣的基本操作,可以極大的簡化我們的運算,這就是計算機科學的好處。 而矩陣在高等數學中扮演極其重要的作用。在其他科學中也扮演重要角色。矩陣的運算是數值分析領域的重要問題。將矩陣分解為簡單矩陣的組合可以在理論和實際應用上簡化矩陣的運算。對一些應用廣泛而形式特殊的矩陣,例如稀疏矩陣和準對角矩陣,有特定的快速運算算法。關于矩陣相關理論的發展和應用,請參考矩陣理論。在天體物理、量子力學等領域,也會出現無窮維的矩陣,是矩陣的一種推廣。通過對于在C語言下對于矩陣進行相關

24、的算法分析。可以發現,對于大多數問題,可以調用一些函數,通過函數的組合,來實現一些復雜的問題。由此其實最好的方法就是將個個方法封裝起來,例如將加減乘除,數乘等運算封裝成一個一個函數,完全可以建立屬于自己的一個頭文件,然后就可以通過調用頭文件中的函數來大大簡化代碼量通過這次結業論文,加深了對于C語言的理解,尤其是對于二維數組的使用。數組,是C語言中重要的組成部分,多練習之后才可以熟練的使用。所以這一次結課論文,對于我來說是一次很好的練習C語言的機會。對于數組的使用,要善于使用數組下標和相對應的組內元素的關系。這有點像哈希表,通過組建一組映射來得以建立相關關系。這種方法可以極大簡化算法的時間復雜度

25、,這是一種以空間換取時間的方法。這樣,就可以達到最終的目的。4 參考文獻C程序設計,譚浩強,清華大學出版社c primer plus,作者Stephen Prata,譯者云巔工作室,人民郵電出版社矩陣 ,百度百科 線性代數與空間解析幾何,黃廷祝,高等教育出版社C語言矩陣的運算,百度文庫思考題(1)在下圖乘法豎式中,每一個星號代表一個數位,若出現的數字有且僅有2,3,5,7四種,你能將這個豎式還原嗎? * * * * * * * * * * * * * * * *程序代碼#include <stdio.h>int main ()int a5,b4;int biaozhun4=2,3,

26、5,7;int e , f , g , h , i , k , l , m ;int chengyi,chenger,he,zhunqueshu,diyibu,dierbu;for ( e = 0; e < 4 ; e+)for (f = 0 ; f < 4 ;f+)for (g = 0; g < 4;g+) chengyi = 100 * biaozhune + 10 * biaozhunf + 1 * biaozhung; for (h = 0;h < 4; h+) for (i = 0 ; i < 4; i+) chenger = 10 * biaozhun

27、h + 1*biaozhun i; he = chengyi * chenger; diyibu = chengyi * biaozhuni; b0 = diyibu % 10; b1 = (diyibu / 10) %10; b2 = (diyibu / 100) % 10; b3 = (diyibu / 1000) % 10; if (b0 = 2 | b0 = 3 | b0 = 5 | b0 = 7) && (b1 = 2 | b1 = 3 | b1 = 5 | b1 = 7) && (b2 = 2 | b2 = 3 | b2 = 5 | b2 = 7)

28、&& (b3 = 2 | b3 = 3 | b3 = 5 | b3 = 7) ) diyibu = b0*1+b1*10+b2*100+b3*1000; else continue; a0 = he % 10; a1 = (he / 10) % 10; a2 = (he / 100) % 10; a3 = (he / 1000) % 10; a4 = (he / 10000) % 10; if (a0 = 2 | a0 = 3 | a0 = 5 | a0 = 7) && (a1 = 2 | a1 = 3 | a1 = 5 | a1 = 7) &&

29、 (a2 = 2 | a2 = 3 | a2 = 5 | a2 = 7) && (a3 = 2 | a3 = 3 | a3 = 5 | a3 = 7) &&(a4 = 2 | a4 = 3 | a4 = 5 | a4 = 7) )zhunqueshu =a0*1+a1*10+a2*100+a3*1000+a4*10000;printf ("這個數是%dn",zhunqueshu); 思考題二擲骰子問題游戲規則:每個骰子有六面,點數分別是1,2,3,4,5,6游戲者在程序開始時輸入一個無符號整數,作為產生隨機數的種子。每輪擲兩次骰子,第一輪如果和數為7或者11就為勝,游戲結束;和數為2,3,12則為負,游戲結束;和數為其他值,則以該值作為自己的點數,繼續第二輪,第三輪。直到某輪的和數等于點數

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論