矩阵运算

#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;
}
}

时间: 2024-11-10 15:11:26

矩阵运算的相关文章

《Linear Algebra and Its Applications》-矩阵运算

可以说第一章<Linear Algebra and Its Applications>着重介绍了线性代数中几个核心概念(向量.矩阵和线性方程组)之间的关系(方程的同解性),那么下面这本书开始分别介绍这几个核心概念,比如从这篇文章开始,会简单的介绍矩阵方面的内容. 首先对于我们定义的计算工具(矩阵),我们有必要研究其运算规律,这个方法在定义很多新的运算符号的时候都是适用的.矩阵的加减法这里就不用累述的,非常好理解,这篇文中我们主要来讨论矩阵的乘法运算的定义过程. 其实不管是从离散的角度还是在线性

《Linear Algebra and Its Applications》- 线性方程组

同微分方程一样,线性代数也可以称得上是一门描述自然的语言,它在众多自然科学.经济学有着广阔的建模背景,这里笔者学识有限暂且不列举了,那么这片文章来简单的讨论一个问题——线性方程组. 首先从我们中学阶段就很熟系的二元一次方程组,我们采用换元(其实就是高斯消元)的方法.但是现在我们需要讨论更加一般的情况,对于线性方程,有如下形式: a1x1+a2x2+…anxn = b. 现在我们给出多个这样的方程构成方程组,我们是否有通用的解法呢? 在<Linear Algebra and Its Applica

Memo - Chapter 6 of Strang&#39;s Linear Algebra and Its Applications

1.实对称矩阵的正定 2.实对称矩阵的半正定 3. Sylvester’s law of inertia : 4.Sylvester’s law of inertia 的推论: 5. SVD 6.瑞利伤: Memo - Chapter 6 of Strang's Linear Algebra and Its Applications

Memo - Chapter 3 of Strang&#39;s Linear Algebra and Its Applications

1.正交向量.正交空间.正交补空间 2.号称是本书最重要的配图 3.向量的cosine距离,投影变换,最小二乘 4.正交基与Schmidt正交化与QR分解 5.函数空间,傅里叶级数,Hilbert空间 Memo - Chapter 3 of Strang's Linear Algebra and Its Applications

《Linear Algebra and Its Applications》-矩阵的逆

矩阵的逆: 逆矩阵的定义: 类比于我们在研究实数的时候回去讨论一个数的倒数,对应的,在矩阵运算中,当AB = I的时候,A,B互称为逆矩阵,这里的I类似实数中的1,表示单位矩阵,即对角线是1其余位置是0的n x n的矩阵. 逆矩阵的唯一性: 逆矩阵是像实数的倒数一样唯一存在的么?我们不妨简单地证明一下.假设A的两个逆矩阵是B,C.根据定义我们有AB=I,AC=I,结合基本的矩阵运算法则,容易看到B=C=IA^-1,由此能够看到逆矩阵是唯一存在的. 如何求解逆矩阵: 如何求解逆矩阵这个问题其实能够

《Linear Algebra and Its Applications》-chaper6正交性和最小二乘法-正交性

这一章节我们主要讨论定义在R^n空间上的向量之间的关系,而这个关系概括来讲其实就是正交,然后引入正交投影.最佳逼近定理等,这些概念将为我们在求无解的线性方程组Ax=b的最优近似解打下基石. 正交性: 先举个最简单的例子,在平面中,两个二维向量的点乘如果为0,那么我们可判定两个向量互相垂直,那么实际上这两个向量就是R^2向量空间上的一组正交向量. 下面推广到R^n向量空间上,给出正交性的定义: 正交集: 给定向量集合S,当S中任意两个元素都相互正交,我们称S是一个正交集. 基的一个概念其实表征一个

《Linear Algebra and Its Applications》-线性变换

线性变换: 先前我们曾经提到过,在讨论矩阵方程Ax = b和向量方程x1a1+x2a2+x3a3+…+xnan = b同解性的时候,我们曾经说过这这将呼应了矩阵乘法运算的规则.但是在这里我们首先介绍一个过渡的概念——线性变换. 考察矩阵方程Ax = b,A是n x m矩阵,x是R^n向量,由先前我们所定义的规则,b必然是R^m向量.我们抽象化这个过程,从集合论或者是函数的角度去看待这样一个明显有着映射的过程,我们将向量x视为原像,向量b视为像,而乘以矩阵A作为一种对应关系. 为什么要建立这样一个

《Linear Algebra and Its Applications》-矩阵方程

矩阵方程: 先前我们介绍过向量的线性组合,即x1a1+x2a2+xnan的形式,我们能够用含有[]的式子将其表达出来呢?(寻求这种表达方式是为了寻求运算的便利与统一),我们给出如下的定义来给出向量线性组合的另外一种形式. 可以看到,等式的右边,即向量组合的形式,我们利用向量的代数性质将其进行求和运算,我们最终将会得到一个向量b,即这个等式能够写成Ax=b的形式,而容易看到,A写成[a1,a2,…an]的形式,ai同时也是向量,即代表A是一个m x n的矩阵(m代表向量的分量数,即R^m向量),b

《Linear Algebra and Its Applications》-chaper3-线性方程组- 线性变换

两个定理非常的简单显然,似乎是在证明矩阵代数中的基本运算律.但是它为后面用“线性变换”理解矩阵-向量积Ax奠定了理论基础. 结合之前我们讨论过的矩阵和向量的积Ax的性质,下面我们就可以引入线性变换了. 由于矩阵A和向量x的乘积的性质与线性变换的定义有着密切的联系,我们能够进一步的探索矩阵A在线性变换中扮演着怎样的角色. 有了线性变换和标准矩阵的概念,我们就有了强有力的工具用来表示实际问题中一系列诸如拉伸.伸缩的线性变换了.

《Linear Algebra and Its Applications》-chaper4-向量空间-子空间、零空间、列空间

在线性代数中一个非常重要的概念就是向量空间R^n,这一章节将主要讨论向量空间的一系列性质. 一个向量空间是一些向量元素构成的非空集合V,需要满足如下公理: 向量空间V的子空间H需要满足如下三个条件: 两个定理均在阐述如何构成子空间,其证明也只需要简单的证明构造出的子空间满足子空间H需要满足的三个条件即可.