[代碼全屏查看]-基於一維數組動態處理矩陣運算

2021-01-11 開源中國
[1].[代碼] 基於一維數組動態處理矩陣運算 跳至 [1] [2] [3]

/*******************************************根據用戶輸入的數據申請一維動態數組,並進行相關的運算,矩陣求和、矩陣相乘、矩陣的逆矩陣、矩陣的伴隨矩陣、矩陣行列式的值(建議採用visual c++6.0編譯).作者:何晏波2013,6,17*********************************************/#include<iostream>#include<cmath>using namespace std;#include"function.h"int main(){ int n,m,n1,m1,count(1); int *p,*p1,i; system("color 1e"); cout<<"請輸入第1個矩陣的行數與列數:"<<endl; cin>>m>>n;//主函數輸入矩陣1 p=new int [m*n]; for(i=0;i<m*n;i++) { if(i%n==0) cout<<"請輸入第"<<i/n+count<<"行的"<<n<<"個元素"<<endl; cin>>p[i]; } cout<<"請輸入第2個矩陣的行數與列數:"<<endl; cin>>m1>>n1;//主函數輸入矩陣2 p1=new int [m1*n1]; for(i=0;i<m1*n1;i++) { if(i%n1==0) cout<<"請輸入第"<<i/n1+count<<"行的"<<n1<<"個元素"<<endl; cin>>p1[i]; } cout<<"============"<<endl; cout<<"你輸入的矩陣1是:"<<endl;print(p,m,n); cout<<"你輸入的矩陣2是:"<<endl; //輸出矩陣1print(p1,m1,n1); //輸出矩陣2if(m==n||m1==n1)cout<<"============\n\n";if(m==n)zhuan_zhi(p,m); //矩陣1的轉置矩陣if(m1==n1)zhuan_zhi(p1,m1); //矩陣2的轉置矩陣if(m==n||m1==n1)cout<<"============\n\n";if(m==m1&&n==n1){count_sum(p,p1,m,n);cout<<"===============\n";}if(n==m1){cheng_matrix(p,p1,m,n,n1);cout<<"====================\n";}if(m==n){cout<<"矩陣1的行列式的值為:"<<determinant(p,m)<<endl;cout<<"=======================\n";}if(m1==n1){cout<<"矩陣2的行列式的值為:"<<determinant(p1,m1)<<endl;cout<<"=======================\n";}if(m==n){cout<<"矩陣1的伴隨矩陣為:\n";companion_matrix(p,m);cout<<"====================\n";}if(m1==n1){cout<<"矩陣2的伴隨矩陣為:\n";cout.unsetf(ios::fixed);cout.precision(6);companion_matrix(p1,m1);cout<<"====================\n";}system("pause"); return 0;}/***********************************function.h頭文件主要實現實現主函數當中的功能模塊,有輸出函數、矩陣求和、求矩陣的逆矩陣、矩陣的伴隨矩陣、矩陣的行列式的值.************************************//******輸出用戶輸入的矩陣******/void print(int p[],int m,int n){ for(int i=0;i<m;i++) { for(int j=0;j<n;j++) cout<<'|'<<p[i*n+j]; cout<<'|'<<endl;}}/******基於一維數組的轉置矩陣******/void zhuan_zhi(int p[],int m){ static int j1=1; int *p1; p1=new int[m*m]; for(int i=0;i<m;i++) for(int j=0;j<m;j++) { p1[j*m+i]=p[i*m+j]; } if(j1<3) cout<<"矩陣"<<j1<<"的轉置矩陣為:"<<endl; print(p1,m,m); j1++;}/******求矩陣的乘法******/void cheng_matrix(int p[],int p1[],int m,int n,int n1){ int *p2=new int[m*n1]; for(int i=0;i<m;i++) { for(int j=0;j<n1;j++) { p2[i*n1+j]=0; for(int k=0;k<n;k++) p2[i*n1+j]+=p[i*n+k]*p1[k*n1+j]; } } cout<<"這兩個矩陣的乘積為:"<<endl; print(p2,m,n1);}/******計算兩個矩陣的和******/void count_sum(int p[],int p1[],int m,int n){ int *p2; p2=new int[n*m]; for(int i=0;i<n*m;i++) p2[i]=p[i]+p1[i]; cout<<"這兩個矩陣的和為:"<<endl; print(p2,m,n);}/******確定行列式中每個元素的符號******/int symble(int n){ if(n%2==0) return 1; return -1;}/******計算矩陣的行列式的值******/int determinant(const int p[],int m) //將參數p定義為只讀參數是防止通過間接尋址方式對它進行改變{ int *temp,*temp1,*temp2,*b,count(0); if(m==1) return p[0]; if(m==2) return (p[0]*p[3]-p[1]*p[2]); if(m==3) return (p[0]*p[4]*p[8]+p[1]*p[5]*p[6]+p[2]*p[3]*p[7]-p[2]*p[4]*p[6]-p[1]*p[3]*p[8]-p[0]*p[7]*p[5]); if(m>3) { temp=new int[m*m]; temp1=new int[(m-1)*(m-1)]; temp2=new int[m*m]; b=new int[m]; for(int g=0;g<m;g++) b[g]=p[g*m]*symble(g); //將每行元素和符號的乘積記錄在數組b中 for(int i=0;i<m;i++) for(int t=0;t<m;t++) //拷貝一個原數組 temp2[i*m+t]=p[i*m+t]; for(int i1=0;i1<m;i1++) for(int t1=0;t1<m-1;t1++) temp2[i1*m+t1]=temp2[i1*m+t1+1]; //將第一列覆蓋掉 for(int y=0;y<m*m;y++) temp[y]=temp2[y]; //將副本中的元素存於一個臨時數組中 for(int j=0;j<m;j++) { for(int l=j;l<m-1;l++) for(int k=0;k<m;k++) temp2[l*m+k]=temp2[(l+1)*m+k]; //將第l行覆蓋掉 /******這步很重要******/ for(int r=0;r<m-1;r++) //這步很重要,一維與二維的區別就在此處,主要的作用是將經過移位後的元素,集中 for(int q=0;q<m-1;q++) //連續放在一維數組中,如果採用二維數組此處可省,當然一維數組在動態方面更具優勢 temp1[r*(m-1)+q]=temp2[r*m+q]; /******important******/ count+=determinant(temp1,m-1)*b[j]; //此處輸出會遇到困難,不像二維數組可以格式輸出,這是一維數組的缺點 for(y=0;y<m*m;y++) temp2[y]=temp[y]; //此處將副本中的元素初始化 } return count; } }/******計算矩陣的伴隨矩陣及其逆矩陣******/void companion_matrix(const int p[],int m) //將參數p定義為只讀參數是防止通過間接尋址方式對它進行改變{ int *temp,*temp1,*temp2; double *t; static int w=1; t=new double[m*m]; temp=new int[m*m]; temp1=new int [m*m]; temp2=new int[m*m]; for(int q=0;q<m;q++) //創建一個最開始的副本,後面用來初始化 for(int q1=0;q1<m;q1++) temp1[q*m+q1]=p[q*m+q1]; for(q=0;q<m;q++) for(int q1=0;q1<m;q1++) //拷貝一個原數組 temp[q*m+q1]=p[q*m+q1]; for(int i=0;i<m;i++) { for(int j=i;j<m;j++) //將原數組元素第i列覆蓋 for(int k=0;k<m-1;k++) temp[j*m+k]=temp[j*m+k+1]; for(j=0;j<m;j++) //創建一個副本後面要用 for(int k=0;k<m;k++) temp2[j*m+k]=temp[j*m+k]; for(int t1=0;t1<m;t1++) { for(int r=t1;r<m-1;r++) for(int r1=0;r1<m;r1++) temp[r*m+r1]=temp[(r+1)*m+r1]; // 將原數組的i行覆蓋 t[t1*m+i]=determinant(temp,m-1)*symble(i+r); //根據伴隨矩陣定義此處一定要轉置 //t數組中存的是伴隨矩陣 for(j=0;j<m;j++) for(int k=0;k<m;k++) temp[j*m+k]=temp2[j*m+k]; //做行變換之前初始化 } for(j=0;j<m;j++) for(int k=0;k<m;k++) temp[j*m+k]=temp1[j*m+k]; //做列變換之前初始化 } for(q=0;q<m;q++) { //輸出伴隨矩陣 for(int q1=0;q1<m;q1++) cout<<'|'<<t[q*m+q1]; cout<<'|'<<endl; } for(q=0;q<m;q++) for(int q1=0;q1<m;q1++) t[q*m+q1]/=fabs(determinant(p,m)); cout.precision(2); cout.setf(ios::fixed); //保留兩位小數控制精度 if(determinant(p,m)!=0) { cout<<"矩陣"<<w<<"的逆矩陣為"<<endl; for(int q2=0;q2<m;q2++) { for(int q3=0;q3<m;q3++) cout<<'|'<<t[q2*m+q3]; //輸出逆矩陣 cout<<'|'<<endl; } w++; } }

相關焦點

  • 基於一維數組動態處理矩陣運算
    [代碼]基於一維數組動態處理矩陣運算     跳至 [1] [全屏預覽]
  • 教程| 基礎入門:深度學習矩陣運算的概念和代碼實現
    而如果不了解矩陣的運算法則及意義,甚至我們都很難去理解一些如矩陣因子分解法和反向傳播算法之類的基本概念。同時由於特徵和權重都以向量儲存,那如果我們不了解矩陣運算,代碼實現將變得十分艱難。什麼是線性代數?在深度學習中,線性代數是一個強大的數學工具箱,它提供同時計算多維數組的方法。
  • 在VBA中如何使用動態數組,以及利用動態數組去除重複值的方法
    一 :Filter函數:這個函數返回一個下標從零開始的數組,該數組包含基於指定篩選條件的一個字符串數組的子集,語法如下:Filter(sourcesrray, match[, include[, compare]])參數a) sourcesrray是必須的,要執行搜索的一維字符串數組。b) match是必須的,要搜索的字符串。
  • 看圖學NumPy:掌握n維數組基礎知識點,看這一篇就夠了
    教程內容分為向量 (一維數組)、矩陣 (二維數組)、三維與更高維數組3個部分。Numpy數組與Python列表在介紹正式內容之前,先讓我們先來了解一下Numpy數組與Python列表的區別。乍一看,NumPy數組類似於Python列表。
  • LabVIEW創建一維數組
    一維數組是最基本的數組,多維數組是在一維數組的基礎上創建的。一維數組的創建過程如下。  (1)創建數組框架。在前面板窗口控制項選板中選擇控制項「新式→數組、矩陣與簇→數組,置於前面板窗口的空白處,如圖1所示。
  • EXCEL知識:數組運算是什麼?
    下面我主要介紹一些我自己理解的數組運算。什麼是數組在Excel中,數組可以理解為多個單元格的集合。單行數據,單列數據(一維數組),多行多列數據(二維數組),都可以是一個數組。如下圖所示:上圖中數組1和數組2為一維數組,數組4和數組5為二維數組。
  • Python學習第116課——numpy.dot和矩陣相乘的數學運算
    關於numpy中數組的相乘,我們學習了對位相乘(用numpy.multiply、或*直接相乘,比如數組a和b的對位相乘就是numpy.multiply(a,b)或a*b)和一維數組的點乘(dot product,也有人叫inner product,比如一維數組a和b的點乘就是a.b)。
  • MATLAB的矩陣運算與重構
    數組運算與矩陣運算在MATLAB中,術語矩陣和數組在一般情況下是沒有區別的。嚴格地說,一個矩陣就是一個二維的數組,是用來進行線性代數運算的。MATLAB運用於矩陣上的數學運算符是以線性代數中的矩陣運算法則來進行計算的,而數組運算是基於兩個矩陣對應元素之間的,所以在MATLAB中,數組運算和矩陣運算是有區別的。
  • VBA中動態數組的創建及利用
    今日繼續和大家分享VBA編程中常用的常用「積木」過程代碼。這些內容大多是我的經驗的記錄,來源於我多年的經驗。今日分享的是NO.244,內容是:VBA過程代碼244:VBA中動態數組的定義及創建VBA過程代碼244:VBA中動態數組的定義及創建Sub Mynz()Dim arr() As Stringerow = [c65536].End(3).Row '最後一個非空單元格行號j = 1 '數組索引號
  • 基於複數浮點運算的協方差矩陣的FPGA實現
    引言本文引用地址:http://www.eepw.com.cn/article/201706/349296.htm  協方差矩陣的計算是信號處理領域的典型運算,是實現多級嵌套維納濾波器、空間譜估計、相干源個數估計以及仿射不變量模式識別的關鍵部分,廣泛應用於雷達、聲吶、數字圖像處理等領域。
  • 【ADAMS】矩陣/數組函數
    導讀:面向應用工程師的商業軟體諮詢、自研軟體定製開發服務的仿真公眾號,點擊關注進入菜單,查看更多精彩內容。矩陣/數組函數可很方便地完成針對矩陣/數組的操作。返回矩陣最後一個元素LAST_N 返回矩陣最後N 個元素MAX 返回矩陣元素的最大值MAXI 返回矩陣元素最大值的位置索引MEAN 返回矩陣元素的平均值MIN 返回矩陣元素的最小值MINI 返回矩陣元素最小值的位置索引NORM2 返回矩陣元素平方和的平方根NORMALIZE 矩陣歸一化處理
  • Python數據分析利器,Pandas入門介紹,幫你便捷高效處理複雜數據
    關於Python的數據分析,當我們遇到的數據量小、數據結構簡單時,可以通過字典、列表等Python常見的數據結構來處理。但是當我們面對的大量數據以及複雜數據的局面時,就需要用一些專門用於數據分析的擴展庫來處理數據了。今天給大家介紹一個Python裡專門用來做數據分析和處理的擴展庫。
  • 圖解NumPy,這是理解數組最形象的一份教程了
    NumPy 將它們視為 position-wise 運算:我們也可以對不同大小的兩個矩陣執行此類算術運算,但前提是某一個維度為 1(如矩陣只有一列或一行),在這種情況下,NumPy 使用廣播規則執行算術運算:點乘算術運算和矩陣運算的一個關鍵區別是矩陣乘法使用點乘。
  • NumPy數組中的廣播機制及結構化數組
    廣播機制廣播機制這一操作實現了對兩個或以上數組進行運算或用函數處理,即使這些數組形狀並不完全相同。並不是所有的維度都要彼此兼容才符合廣播機制的要求,但它們必須要滿足一定的條件。前面講過,在NumPy中,如何通過用表示數組各個維度長度的元素(也就是數組的型)把數組轉換成多維數組。因此,若兩個數組的各維度兼容,也就是兩個數組的每一維等長,或其中一個數組為一維,那麼廣播機制就適用。如果這兩個條件都不能滿足,NumPy就會拋出異常,說這兩個數組不兼容。執行完代碼之後,我們就得到了兩個數組:4x4的數組以及一個一行四列的數組。
  • Python入門教程(二):Numpy數組基礎
    本文代碼已經整理到百度網盤,領取方式詳見文末!Python中的數組操作幾乎等同於Numpy數組操作,今天我們會展示用Numpy數組操作獲取數據或者子數組,對數組進行分裂,變形和連接的例子。x3 = np.random.randint(10, size=(3, 4, 5))  # 三維數組x3 # 查看x3數組# array([[[8, 1, 5, 9, 8],# [9, 4, 3, 0, 3],#       [5, 0, 2, 3, 8],# [1, 3, 3, 3, 7]],# [[0, 1, 9, 9, 0],#
  • MATLAB代碼大全
    向量轉置  \ 矩陣左除 = 賦值運算  / 矩陣右除 == 關係運算之相等  .\ 向量左除 ~= 關係運算之不等  ./ 向量右除 < 關係運算之小於  : 向量生成或子陣提取 <= 關係運算之小於等於  () 下標運算或參數定義 > 關係運算之大於  [] 矩陣生成 >=
  • 動態規劃:關於01背包問題,你該了解這些!(滾動數組)
    昨天動態規劃:關於01背包問題,你該了解這些!中是用二維dp數組來講解01背包。今天我們就來說一說滾動數組,其實在前面的題目中我們已經用到過滾動數組了,就是把二維dp降為一維dp,一些錄友當時還表示比較困惑。
  • VBA代碼中數組的拆分與合併的實現
    今日繼續和大家分享VBA編程中常用的常用「積木」過程代碼。這些內容大多是我的經驗的記錄,來源於我多年的經驗。當前的代碼多是出自」VBA數組與字典解決方案」,有一些朋友反映分享的內容不能很好的理解,可以參考這套資料的內容進行研讀。今日分享的是第250集。
  • Excel VBA如何定義數組,這裡有最全的數組定義方法
    Dim + 數組名定義數組用Dim關鍵字,後面的一些參數,沒有也可以,表示任意大小或任意類型的數組。Dim Arr(0 to 10)這樣就定義了一個由最小下標為0,最大下標為10的一維數組,也就是Arr數組裡面包含了從0~10的11個變量。
  • Python編程:如何規範numpy中數組元素的列印輸出格式
    引言對於Python語言開發者,如果你經常處理大量數據運算的話,numpy是一個必不可少的程序擴展庫,它支持大維度數組與矩陣運算,提供了非常豐富的數學運算函數,並且,相對於Python自身提供的列表類型,它在運算速度上有著無與倫比的優勢。