用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

}

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

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

}

#include<stdio.h>

#define N 3

int arry[N][N],b[N][N]

int main(){

void merg(int arry[3][3])

int a[3][3],i,j

for(i=0i<Ni++)

for(j=0j<Nj++){

scanf("%d",&arry[i][j])

}

printf("原始的矩阵为:\n")

for(i=0i<Ni++){

for(j=0j<Nj++){

printf("%d ",arry[i][j])

}

printf("\n")

}

printf("\n")

merg(arry)

printf("变换后的矩阵为:\n")

for(i=0i<Ni++){

for(j=0j<Nj++){

printf("%d ",b[i][j])

}

printf("\n")

}

}

void merg(int arry[3][3]){

int i,j,temp

for(i=0i<Ni++)

for(j=0j<Nj++){

b[j][i]=arry[i][j]

}

}

扩展资料:

for循环:

语句的一般形式为:

for (表达式1表达式2表达式3)

{

语句

}

表达式1、表达式2和表达式3之间是用分号隔开的,千万不要写成逗号。

for(表达式1;表达式2;表达式3)的后面千万不要加分号。

执行过程:

求解表达式1。

求解表达式2。若其值为真,则执行 for 语句中指定的内嵌语句,然后执行第3步;若表达式2值为假,则结束循环,转到第5步。

求解表达式3。

转回上面第2步继续执行。

循环结束,执行 for 语句下面的语句。

多层 for 循环:

执行过程与单个 for 循环的执行过程是一模一样的。多层 for 循环将单个 for 循环大括号中的“语句”换成了 for 循环。


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

原文地址: http://outofmemory.cn/yw/11702800.html

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

发表评论

登录后才能评论

评论列表(0条)

保存