!!!跪求C语言实现矩阵运算(加,减,乘、求逆、转置)

Python012

!!!跪求C语言实现矩阵运算(加,减,乘、求逆、转置),第1张

1、首先打开vs2015(其他版本也可以),新建一个Windows Form窗体程序或者控制台都可以。

2、 定义一个名为array1的数组并赋值:double[,] array1 = new double[3, 3] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }下面求该矩阵转置矩阵。

3、接下来实现矩阵的转置运算,可以写函数也可以写类,右键解决方案下的项目名,添加-类。

4、创建一个名为“turnzhi”的类(名字随便取,最好用英文,有时候中文名程序会报错),然后点击“添加”。

5、转置类的代码如下图所示。

6、在主程序调用转置类,用两个for循坏将转置后的数组(array)输出来;并将结果显示在textbox中。

7、最后运行程序查看编写的结果:147、258、369。转置后的结果正确,这样就实现了c#矩阵的转置运算。

矩阵的表示使用二维数组,当然二维数组通常情况下是不可以动态分配的,因此最好已开始定义一个足够大的数组来存放矩阵元素。至于加减乘逆等运算,主要是利用嵌套循环操作其单个元素,由于每个人的方法不一样就不详细说了。希望对你有所帮助。

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

#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

}