程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 矩陣運算,矩陣運算法則

矩陣運算,矩陣運算法則

編輯:C++入門知識

矩陣運算,矩陣運算法則


#include <iostream>

#include <cstdlib>

#include <ctime>

#include <iomanip> //頭文件,包含所需要的函數

using namespace std; //命名空間


typedef struct{ //定義矩陣結構體
int n;
int m;
int *data;
}Matrix;

void MatrixMenu(); //菜單函數

Matrix IntiMatrix(); //初始化矩陣函數

void PrintMatrix(int *p, int a, int b); //顯示矩陣函數

void MatrixMultiply(Matrix p, Matrix q); //矩陣相乘函數

void MatrixTransposition(int *p, int a, int b); //矩陣轉置函數


//主函數
//功能:控制整個程序的運行

int main()
{
Matrix mat; //定義矩陣結構體變量
mat.data = NULL; //結構體內的指針指向空
mat.m = mat.n = 0; //矩陣的行數和列數為0
char a; //定義輔助switch控制變量
do //do...while,控制程序運行
{
MatrixMenu(); //調用菜單函數
cin >> a;
switch (a) //用switch來控制程序
{
case 'I':
mat = IntiMatrix(); //調用初始化矩陣函數
break;
case 'M':
MatrixMultiply(IntiMatrix(), IntiMatrix()); //調用矩陣相乘函數
break;
case 'T':
MatrixTransposition(mat.data, mat.n, mat.m); //調用矩陣轉置函數
break;
case 'P':
PrintMatrix(mat.data, mat.n, mat.m); //調用顯示矩陣函數
break;
case 'E':
cout << "您已退出!" << endl; //程序終止接口
break;
default: //錯誤輸入提示
cout << "輸入有誤,請重新輸入!"<< endl;
break;
}
} while (a!='E'); //判斷是否選擇了退出
return 0; //整個程序結束
}

//菜單函數
//功能:顯示菜單

void MatrixMenu()
{
cout << "----------矩---陣---運---算----------" << endl;
cout << "\tI:初 始 化 n * m 矩 陣" << endl;
cout << "\tM:求 兩 個 矩 陣 相 乘" << endl;
cout << "\tT:求 轉 置 矩 陣" << endl;
cout << "\tP:顯 示 矩 陣" << endl;
cout << "\tE:退 出" << endl;
cout << "-------------------------------------" << endl;
cout << "請輸入您的選擇:";
}

//初始化矩陣函數
//功能:初始化一個矩陣,並將該矩陣結構體返回

Matrix IntiMatrix()
{
Matrix ma; //定義矩陣結構體變量
int *k; //定義輔助指針
cout << "請輸入行數 n 與列數 m :";
cin >> ma.n >> ma.m; //輸入矩陣的行數和列數
ma.data = (int *)malloc(sizeof(int)*ma.n*ma.m); //為結構體內的指針申請存儲空間
srand(time(NULL)); //生成隨機數種子
k = ma.data; //輔助指針指向搜元素
for (int i = 0; i < ma.n*ma.m; ++i)
{
*(k++) = rand() % 100 + 1; //給每一位元素賦值隨機數
}
cout << endl;
cout << ma.n << "*" << ma.m << "=" << ma.n*ma.m << "隨機數矩陣已成功生成!\n" << endl;
return ma; //返回矩陣機結構體
}

//矩陣相乘函數
//功能:生成兩個矩陣,將其相乘

void MatrixMultiply(Matrix q,Matrix p)
{
cout << "P矩陣如下:"<<endl;
PrintMatrix(p.data, p.n, p.m); //顯示生成的P矩陣
cout << "Q矩陣如下:" << endl;
PrintMatrix(q.data,q.n,q.m); //顯示生成的Q矩陣
if (p.m != q.n) //判斷是否符合矩陣生成的條件
{
cout << "P矩陣和Q矩陣不符合矩陣相乘的條件!請保證P矩陣的列數與Q矩陣的行數相等!" << endl;
return; //不符合則返回主函數
}
else
{
Matrix matmul; //定義新矩陣結構體
matmul.data = (int *)malloc(sizeof(int)*p.n*q.m); //申請p.n*q.m個空間
for (int s = 0; s < p.n*q.m; s++){ //初始化p.n*q.m個元素
*(matmul.data+s) = 0;
}
for (int i = 1; i <= p.n; i++){ //三個for循環實現矩陣相乘
for (int j = 1; j <= q.m; j++){
for (int k = 1; k <= p.m; k++){
*(matmul.data+j-1+(i-1)*q.m) += *(p.data + (i - 1)*p.m + k - 1)*(*(q.data + (k - 1)*q.m + j - 1));
}
}
}
cout << "P矩陣與Q矩陣乘積為:" << endl;
PrintMatrix(matmul.data,p.n,q.m); //顯示矩陣相乘的新矩陣
}
}


//矩陣轉置函數
//功能:將矩陣轉置

void MatrixTransposition(int *p, int a, int b)
{
if (p == NULL) //判斷傳入該函數的矩陣是否為空
{
cout << "請先初始化矩陣!" << endl;
return ; //返回主函數
}
else
{
int *t; //定義轉置矩陣的元素指針
t = (int *)malloc(sizeof(int)*a*b); //為該指針申請空間
for (int j = 1; j <= b; j++) //實現轉置的算法
{
for (int i = 1; i <= a; i++)
{
*(t + (j - 1)*a + i - 1) = *(p + (i - 1)*b + j - 1); //轉置賦值
}
}
cout << "轉置矩陣為:" << endl;
PrintMatrix(t, b, a); //顯示轉置後的矩陣
}
}

//顯示矩陣函數
//功能:顯示矩陣

void PrintMatrix(int *p, int a, int b)
{
if (p == NULL) //判斷傳入該函數的矩陣是否為空
{
cout << "請先初始化矩陣!" << endl;
return; //返回主函數
}
else
{
cout << a << "*" << b << "的矩陣如下:" << endl;
for (int i = 0; i < b; i++) //顯示矩陣周圍的線
cout << " _ _ _";
cout << endl;
for (int i = 1; i <= a; i++){ //顯示矩陣周圍的線
cout << "|";
for (int j = 1; j <= b; j++){ //輸出矩陣元素的循環
cout << " " << setw(4)
<< *(p + j - 1 + (i - 1) * b) << " "; //輸出矩陣元素
}
cout << "|" << endl;
}
for (int i = 0; i < b; i++) //顯示矩陣周圍的線
cout << " _ _ _";
cout << endl;
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved