用C语言编写一个矩阵运算的程序,高分!

用C语言编写一个矩阵运算的程序,高分!,第1张

//矩阵三元组之矩阵相加 相乘

#include <iostream>

using namespace std

typedef int Elemtype

#define MAXSIZE 12500 //最大非零元素

typedef struct Triple

{

Elemtype value

int row,col

}Triple

typedef struct TSMatrix

{

Triple data[MAXSIZE+1]

int mu,nu,tu

}TSMatrix

TSMatrix T

void InputMatrix(TSMatrix &T) //输入t个非零元素

{

cout<<"请输入稀疏矩阵的信息,(行,列,非零元素个数)"<<endl

cin>>T.mu>>T.nu>>T.tu

int i

cout<<"请输入非零元素的信息(行,列,值),提醒(下标从1开始)"<<endl

for(i=1i<=T.tu++i)

{

cin>>T.data[i].row>>T.data[i].col>>T.data[i].value

}

}

void Output(TSMatrix T)

{

cout<<"矩阵的三元组表示(ROW=)"<<T.mu<<" COL="<<T.nu<<"非零个数="<<T.tu<<endl

int i

for(i=1i<=T.tu++i)

{

cout<<"ROW(行):"<<T.data[i].row<<" COL(列):"<<T.data[i].col<<" Value(值)"<<T.data[i].value<<endl

}

}

void TransposeSMatrix(TSMatrix M,TSMatrix &T) //矩阵的转置

{

T.mu=M.nuT.nu=M.muT.tu=M.tu

int i,j,k=1

for(i=1i<=M.nu++i)

{

for(j=1j<=M.tu++j)

if(M.data[j].col==i)

{

T.data[k].row=i

T.data[k].col=M.data[j].row

T.data[k].value=M.data[j].value

++k

}

}

}

void AddMastrix(TSMatrix M,TSMatrix T,TSMatrix &Q) //矩阵相加

{

int index_a,index_b,i=1,j=1,k=1

Q.mu=M.muQ.nu=M.nu

while (i<=M.tu&&j<=T.tu)

{

index_a=(M.data[i].row)*(M.data[i].col)+M.data[i].col

index_b=(T.data[j].row)*(T.data[j].col)+T.data[j].col

if(index_a<index_b)

{

Q.data[k]=M.data[i]

i++

k++

}

else if(index_a>index_b)

{

Q.data[k]=T.data[j]

j++

k++

}

else if(index_a==index_b)

{

if((M.data[i].value+T.data[j].value)!=0)

{

Q.data[k]=M.data[i]

Q.data[k].value=M.data[i].value+T.data[j].value

k++

}

++i

++j

}

}

//复制剩余元素

for(i<=M.tu++i)

{

Q.data[k]=M.data[i]

k++

}

for(j<=T.tu++j)

Q.data[k++]=T.data[j]

Q.tu=k-1

}

void Multiply(TSMatrix M,TSMatrix T,TSMatrix &Q) //相乘

{

if(M.nu!=T.mu)

{

cerr<<"两矩阵相乘不合法"<<endl

return

}

int *rowSize=new int[T.mu+1]//存放每行非零元素的个数

int *rowStart=new int[T.mu+2]//矩阵每行在三元组开始位置

int *temp=new int[T.nu+1] //存放结果矩阵中每行的计算结果

int i,Current,k,ROWM,COLM,COLB

for(i=1i<=T.mui++) rowSize[i]=0

for(i=1i<=T.tu++i) rowSize[T.data[i].row]++

rowStart[1]=1

for(i=2i<=T.mu+1i++)

rowStart[i]=rowStart[i-1]+rowSize[i-1]

Current=1k=1

while (Current<=M.tu)

{

ROWM=M.data[Current].row //当前三元组数据中元素的行号

for(i=1i<=T.nu++i) temp[i]=0

while (Current<=M.tu&&ROWM==M.data[Current].row)

{

COLM=M.data[Current].col //当前元素的列号,方便与T矩阵的行号相乘

for(i=rowStart[COLM]i<rowStart[COLM+1]i++) //对应T矩阵中每行的个数

{

COLB=T.data[i].col

temp[COLB]+=(M.data[Current].value)*(T.data[i].value)

}

Current++

}

for(i=1i<=T.nui++)

{

if(temp[i]!=0)

{

Q.data[k].row=ROWM

Q.data[k].col=i

Q.data[k].value=temp[i]

}

k++

}

}

Q.mu=M.muQ.nu=T.nu

Q.tu=k-1

}

int main()

{

TSMatrix T,M,Q,S

InputMatrix(M)

InputMatrix(T)

cout<<"两矩阵相乘"<<endl

Multiply(M,T,Q)

Output(Q)

cout<<"两矩阵相加"<<endl

AddMastrix(M,M,S)

Output(S)

system("pause")

return 0

}

一、矩阵的表示方法

1、矩阵元素必须在”[]”内;

2、矩阵的同行元素之间用空格(或”,”)隔开;

3、矩阵的行与行之间用””(或回车符)隔开;

4、矩阵的元素可以是数值、变量、表达式或函数;

5、矩阵的尺寸不必预先定义。

二、矩阵的运算

1、算术运算

MATLAB的基本算术运算有:+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)、’(转置)。运算是在矩阵意义下进行的,单个数据的算术运算只是一种特例。

(1)矩阵加减运算假定有两个矩阵A和B,则可以由A+B和A-B实现矩阵的加减运算。运算规则是:若A和B矩阵的维数相同,则可以执行矩阵的加减运算,A和B矩阵的相应元素相加减。如果A与B的维数不相同,则MATLAB将给出错误信息,提示用户两个矩阵的维数不匹配。

(2)矩阵乘法假定有两个矩阵A和B,若A为m*n矩阵,B为n*p矩阵,则C=A*B为m*p矩阵。

(3)矩阵除法在MATLAB中,有两种矩阵除法运算:\和/,分别表示左除和右除。如果A矩阵是非奇异方阵,则A\B和B/A运算可以实现。

A\B等效于A的逆左乘B矩阵,也就是inv(A)*B,而B/A等效于A矩阵的逆右乘B矩阵,也就是B*inv(A)。对于含有标量的运算,两种除法运算的结果相同。对于矩阵来说,左除和右除表示两种不同的除数矩阵和被除数矩阵的关系,一般A\B≠B/A。

(4)矩阵的乘方一个矩阵的乘方运算可以表示成A^x,要求A为方阵,x为标量。

(5)矩阵的转置对实数矩阵进行行列互换,对复数矩阵,共轭转置,特殊的, *** 作符.’共轭不转置(见点运算);

(6)点运算在MATLAB中,有一种特殊的运算,因为其运算符是在有关算术运算符前面加点,所以叫点运算。点运算符有.*、./、.\和.^。两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵的维参数相同。

2、关系运算

MATLAB提供了6种关系运算符:&lt(小于)、&lt=(小于或等于)、&gt(大于)、&gt=(大于或等于)、==(等于)、~=(不等于)。关系运算符的运算法则为:

(1)当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式结果为1,否则为0;

(2)当参与比较的量是两个维数相同的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成;

(3)当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。

3、逻辑运算

MATLAB提供了3种逻辑运算符:&(与)、|(或)和~(非)。逻辑运算的运算法则为:

(1)在逻辑运算中,确认非零元素为真,用1表示,零元素为假,用0表示;

(2)设参与逻辑运算的是两个标量a和b,那么,a&b a,b全为非零时,运算结果为1,否则为0。a|b a,b中只要有一个非零,运算结果为1。~a当a是零时,运算结果为1;当a非零时,运算结果为0。

(3)若参与逻辑运算的是两个同维矩阵,那么运算将对矩阵相同位置上的元素按标量规则逐个进行。最终运算结果是一个与原矩阵同维的矩阵,其元素由1或0组成;

(4)若参与逻辑运算的一个是标量,一个是矩阵,那么运算将在标量与矩阵中的每个元素之间按标量规则逐个进行。最终运算结果是一个与矩阵同维的矩阵,其元素由1或0组成;

(5)逻辑非是单目运算符,也服从矩阵运算规则;

(6)在算术、关系、逻辑运算中,算术运算优先级最高,逻辑运算优先级最低。

扩展资料:

1.获取矩阵元素

可以通过下标(行列索引)引用矩阵的元素,如Matrix(m,n)。

也可以采用矩阵元素的序号来引用矩阵元素。

矩阵元素的序号就是相应元素在内存中的排列顺序。

在MATLAB中,矩阵元素按列存储。

序号(Index)与下标(Subscript)是一一对应的,以m*n矩阵A为例,矩阵元素A(i,j)的序号为(j-1)*m+i。

其相互转换关系也可利用sub2ind和ind2sub函数求得。

2.矩阵拆分

利用冒号表达式获得子矩阵:

(1)A(:,j)表示取A矩阵的第j列全部元素;A(i,:)表示A矩阵第i行的全部元素;A(i,j)表示取A矩阵第i行、第j列的元素。

(2)A(i:i+m,:)表示取A矩阵第i~i+m行的全部元素;A(:,k:k+m)表示取A矩阵第k~k+m列的全部元素,A(i:i+m,k:k+m)表示取A矩阵第i~i+m行内,并在第k~k+m列中的所有元素。

此外,还可利用一般向量和end运算符来表示矩阵下标,从而获得子矩阵。end表示某一维的末尾元素下标。

利用空矩阵删除矩阵的元素:

在MATLAB中,定义[]为空矩阵。给变量X赋空矩阵的语句为X=[]。注意,X=[]与clear X不同,clear是将X从工作空间中删除,而空矩阵则存在于工作空间中,只是维数为0。

3、特殊矩阵

(1)魔方矩阵魔方矩阵有一个有趣的性质,其每行、每列及两条对角线上的元素和都相等。对于n阶魔方阵,其元素由1,2,3,…,n2共n2个整数组成。MATLAB提供了求魔方矩阵的函数magic(n),其功能是生成一个n阶魔方阵。

(2)范得蒙矩阵范得蒙(Vandermonde)矩阵最后一列全为1,倒数第二列为一个指定的向量,其他各列是其后列与倒数第二列的点乘积。可以用一个指定向量生成一个范得蒙矩阵。在MATLAB中,函数vander(V)生成以向量V为基础向量的范得蒙矩阵。

(3)希尔伯特矩阵在MATLAB中,生成希尔伯特矩阵的函数是hilb(n)。使用一般方法求逆会因为原始数据的微小扰动而产生不可靠的计算结果。MATLAB中,有一个专门求希尔伯特矩阵的逆的函数invhilb(n),其功能是求n阶的希尔伯特矩阵的逆矩阵。

(4)托普利兹矩阵托普利兹(Toeplitz)矩阵除第一行第一列外,其他每个元素都与左上角的元素相同。生成托普利兹矩阵的函数是toeplitz(x,y),它生成一个以x为第一列,y为第一行的托普利兹矩阵。这里x,y均为向量,两者不必等长。toeplitz(x)用向量x生成一个对称的托普利兹矩阵。

(5)伴随矩阵MATLAB生成伴随矩阵的函数是compan(p),其中p是一个多项式的系数向量,高次幂系数排在前,低次幂排在后。

(6)帕斯卡矩阵我们知道,二次项(x+y)n展开后的系数随n的增大组成一个三角形表,称为杨辉三角形。由杨辉三角形表组成的矩阵称为帕斯卡(Pascal)矩阵。函数pascal(n)生成一个n阶帕斯卡矩阵。

参考资料:

百度百科——帕斯卡矩阵

百度百科——MATLAB

矩阵三角化不知道是什么,其余的看下面代码:

bool addMat(int **mat1, int **mat2, int **matR, int row, int col)

{

for(int i = 0i <rowi++)

{

for(int j = 0j <colj++)

{

*((int*)matR+i*col+j) = *((int*)mat1+i*col+j) + *((int*)mat2+i*col+j)

}

}

return true

}

bool subMat(int **mat1, int **mat2, int **matR, int row, int col)

{

for(int i = 0i <rowi++)

{

for(int j = 0j <colj++)

{

*((int*)matR+i*col+j) = *((int*)mat1+i*col+j) - *((int*)mat2+i*col+j)

}

}

return true

}

bool mulMat(int **mat1, int row1, int col1, int **mat2, int row2, int col2, int **matR)

{

if(col1 != row2)

{

return false

}

int temp1

for(int i = 0i <row1i++)

{

for(int j = 0j <col2j++)

{

temp1 = 0

for(int k = 0k <col1k++)

{

temp1 += *((int*)mat1+i*col1+k) * *((int*)mat2+k*col2+j)

}

*((int*)matR+i*col2+j) = temp1

}

}

return true

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7970742.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存