问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-02 21:40

我来回答

2个回答

热心网友 时间:2022-06-27 12:26

//矩阵三元组之矩阵相加 相乘
#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=1;i<=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=1;i<=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.nu;T.nu=M.mu;T.tu=M.tu;
int i,j,k=1;
for(i=1;i<=M.nu;++i)
{
for(j=1;j<=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.mu; Q.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=1;i<=T.mu;i++) rowSize[i]=0;
for(i=1;i<=T.tu;++i) rowSize[T.data[i].row]++;
rowStart[1]=1;
for(i=2;i<=T.mu+1;i++)
rowStart[i]=rowStart[i-1]+rowSize[i-1];
Current=1; k=1;
while (Current<=M.tu)
{
ROWM=M.data[Current].row; //当前三元组数据中元素的行号
for(i=1;i<=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=1;i<=T.nu;i++)
{
if(temp[i]!=0)
{
Q.data[k].row=ROWM;
Q.data[k].col=i;
Q.data[k].value=temp[i];
}
k++;
}
}
Q.mu=M.mu;Q.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;
}

热心网友 时间:2022-06-27 12:26

等后半夜完事后给你写~~~~
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦到老婆生下儿子一生下儿子就活蹦乱跳 痤疮的抗生素治疗 胸前皮肤痒如何止痒 马拉色菌毛囊炎 面部怎么清洗? NYC 指数是什么意思? 扬州学区多久划分一次 为什么磁铁的磁场是电磁线的磁场呢? 为什么国内求职很少有overqualified这种说法? ...表示你已经做好了工作的准备,同时怎么让面试官对你有个好的第一印... ...同日本及西欧关系的演变,并简述其对世界和中国的影响。 我在老家有一套住宅房和一个门面房!现想在扬州再买一住宅!这算二套还是三套房呢?首付应该多少呢?我是 各位是否清楚关于扬州买房契税需要交多少 扬州近年出台的惠民政策 哥祝福弟的结婚祝福语 扬州买新房子拿房子时还要交哪些钱? 好哥们订婚祝福语 江苏省扬州市 如果名下拥有经济适用房,还能再购买商品房吗? 弟弟订婚祝福语 祝老弟订婚个性祝福语 扬州二手房税收政策 恭喜老弟订婚的说说 外地退休能在江苏扬州市买房子养老吗? 弟弟 订婚祝福语 扬州限购吗 塞尔维亚和黑山以前是一个国家? 请各位历史专家介绍一下自二战以来塞尔维亚的历史。 塞尔维亚简介 求知:塞尔维亚前身是哪个? 京瓷KM—3060打印机打印时出现白纸该怎么解决 塞尔维亚帝国的简介 编写矩阵运算程序(C语言编写) 梦见有人出车祸怎么会事 老弟订婚姐姐怎么祝福 矩阵有关的C语言程序设计 梦见穿红色衣服的未知新娘? 怎样在c语言中编译一个输入任意大小的矩阵的程序 1月9日就是我今天做梦梦见一个穿红衣服的新娘子头上还戴着红布的那种,被伯父伯母打骂。请问专家这是什 祝弟弟订婚的贺语 c语言矩阵运算 哥哥订婚我该讲什么祝福的话? C语言:编写程序,计算两个3×4矩阵的和? C语言矩阵 毛坦厂中学万人送考,送考司机属马,寓意马到成功吗? C语言矩阵程序 求助 c语言程序设计 矩阵加法 求一个 矩阵乘法的C语言程序 求c语言矩阵乘法程序 被称为亚洲最大高考工厂的毛坦厂中学,当地租金直*北上广。对于这种现象你有什么看法? 用c语言设计一个程序判断一个5×5矩阵是否为对称矩阵。谢谢!!! c语言程序设计:矩阵运算系统