基於一維數組動態處理矩陣運算

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

/*******************************************根據用戶輸入的數據申請一維動態數組,並進行相關的運算,矩陣求和、矩陣相乘、矩陣的逆矩陣、矩陣的伴隨矩陣、矩陣行列式的值(建議採用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] [2] [3]
  • 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中,數組運算和矩陣運算是有區別的。
  • 基於複數浮點運算的協方差矩陣的FPGA實現
    引言本文引用地址:http://www.eepw.com.cn/article/201706/349296.htm  協方差矩陣的計算是信號處理領域的典型運算,是實現多級嵌套維納濾波器、空間譜估計、相干源個數估計以及仿射不變量模式識別的關鍵部分,廣泛應用於雷達、聲吶、數字圖像處理等領域。
  • 看圖學NumPy:掌握n維數組基礎知識點,看這一篇就夠了
    教程內容分為向量 (一維數組)、矩陣 (二維數組)、三維與更高維數組3個部分。Numpy數組與Python列表在介紹正式內容之前,先讓我們先來了解一下Numpy數組與Python列表的區別。乍一看,NumPy數組類似於Python列表。
  • 在VBA中如何使用動態數組,以及利用動態數組去除重複值的方法
    大家好,我們今日繼續講解VBA數組與字典解決方案第22講:在VBA中如何使用動態數組,以及利用動態數組去除重複值的方法。如果文本中含有大量的重複值,此時,如果我們要剔除重複值,該怎麼辦?用VBA的方法該如何做到呢?我在這講和下一講中將解答這個問題,並提供給讀者一個可以測試的實例。今日先講這個內容要用到的知識點。
  • 圖解NumPy,這是理解數組最形象的一份教程了
    數組運算讓我們創建兩個 NumPy 數組來展示數組運算功能。我們將下圖兩個數組稱為 data 和 ones:將它們按位置相加(即每行對應相加),直接輸入 data + ones 即可:當我開始學習這些工具時,我發現這樣的抽象讓我不必在循環中編寫類似計算。此類抽象可以使我在更高層面上思考問題。
  • 【ADAMS】矩陣/數組函數
    矩陣/數組函數可很方便地完成針對矩陣/數組的操作。返回矩陣最後一個元素LAST_N 返回矩陣最後N 個元素MAX 返回矩陣元素的最大值MAXI 返回矩陣元素最大值的位置索引MEAN 返回矩陣元素的平均值MIN 返回矩陣元素的最小值MINI 返回矩陣元素最小值的位置索引NORM2 返回矩陣元素平方和的平方根NORMALIZE 矩陣歸一化處理
  • 教程| 基礎入門:深度學習矩陣運算的概念和代碼實現
    而如果不了解矩陣的運算法則及意義,甚至我們都很難去理解一些如矩陣因子分解法和反向傳播算法之類的基本概念。同時由於特徵和權重都以向量儲存,那如果我們不了解矩陣運算,代碼實現將變得十分艱難。什麼是線性代數?在深度學習中,線性代數是一個強大的數學工具箱,它提供同時計算多維數組的方法。
  • 教程| Numpy的線性代數運算
    訪問flyai.club,一鍵創建你的人工智慧項目線性代數(如矩陣乘法、矩陣分解、行列式以及其他方陣數學等)是任何數組庫的重要組成部分。不像某些語言(如MATLAB),通過*對兩個二維數組相乘得到的是一個元素級的積,而不是一個矩陣點積。
  • excel數組和函數sumproduct在乘積求和運算中的實際運用
    Excel在上一篇文章當中,已經為大家簡單介紹了一下數組的概念,並且依次介紹了一維數組和二維數組,其中一維數組包括一維水平數組和一維縱向數組,最後為大家介紹了一維數組和二維數組的生成方法以及二維數組的加法計算,並且將數組計算與數值計算進行了對比
  • MATLAB數組的常用函數
    3.1 函數數組運算規則的定義對於(m´n)的數組,函數的數組運算規則是指:也就是說函數的數組運算是指將函數作用於矩陣中的每一個元素,並將最後的結果儲存為與原矩陣行列數相同的矩陣。3.2 進行數組運算的常用函數本小節列出進行數組運算的常用函數。常用基本數學函數見表2-2,常用三角函數見表2-3,常用適用於向量的函數見表2-4。
  • 矩陣與矩陣乘積簡介
    向量是存儲和操作數據的一種有用的方法,可以用箭頭或數字數組來表示它們。然而,創建更複雜的數據結構是有幫助的,這正是需要引入矩陣的地方。介紹矩陣是正方形或矩形數組,包含兩個維度:行和列,我們可以把它看作是一個電子表格。通常會在數學上下文中看到術語矩陣,在Numpy上下文中看到二維數組。
  • NumPy數組中的廣播機制及結構化數組
    廣播機制廣播機制這一操作實現了對兩個或以上數組進行運算或用函數處理,即使這些數組形狀並不完全相同。並不是所有的維度都要彼此兼容才符合廣播機制的要求,但它們必須要滿足一定的條件。前面講過,在NumPy中,如何通過用表示數組各個維度長度的元素(也就是數組的型)把數組轉換成多維數組。因此,若兩個數組的各維度兼容,也就是兩個數組的每一維等長,或其中一個數組為一維,那麼廣播機制就適用。如果這兩個條件都不能滿足,NumPy就會拋出異常,說這兩個數組不兼容。執行完代碼之後,我們就得到了兩個數組:4x4的數組以及一個一行四列的數組。
  • VBA中動態數組的創建及利用
    今日分享的是NO.244,內容是:VBA過程代碼244:VBA中動態數組的定義及創建VBA過程代碼244:VBA中動態數組的定義及創建Sub Mynz()Dim arr() As Stringerow = [c65536].End(3).Row '最後一個非空單元格行號j = 1 '數組索引號
  • 細說NumPy數組的四種乘法,帶你走進向量運算的奇妙世界
    實際上,NumPy數組乘法遠不止四種。為了在寫作和閱讀時保持清晰的邏輯和清醒的頭腦,本文僅對四種最常見的數組乘法給出詳細說明,並用一道數學題來演示向量點乘和叉乘的用法。1. 星乘(*)先聲明一下:星乘這個說法,是我自己創造的,因為我實在不知道數組的這種乘法有沒有其他高大上的名字,只好用運算符來表示了。所謂數組星乘,就是數組的對應元素相乘,這也是初學NumPy的同學最早接觸到的數組乘法。
  • 單片機的C語言中數組的用法
    下面就對數組進行詳細的介紹。(1)一維數組本文引用地址:http://www.eepw.com.cn/article/201611/320327.htm一維數組是最簡單的數組,用來存放類型相同的數據。數據的存放是線性連續的。
  • 了解什麼是數組,如何應用數組,只需1分鐘就可以秒變數組大神!
    今天他來了,我們一起來從零開始學習什麼是數組。數組其實就是單元格中間的集合或是一組數據處理數值的集合。你也可以寫一個數組公式,即輸入一個單個的公式,讓他它執行多個輸入的公式同時產生的多個結果,讓他們每個結果顯示在一個單元格中進行運算。當然數組公式亦可以看成是有多個數值的公式,他和單個公式的不同之處在於它可以產生一個或者很多的結果。