求助——稀疏矩阵运算器,谢谢

azkabanNULL 2009-05-10 02:26:57
//稀疏矩阵
#include <iostream>
#include <iomanip>
using namespace std;

const int MAXSIZE = 1000;

#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef int Status;
typedef int ElemType;

typedef struct{
int row,col;
ElemType e;
}Triple;

typedef struct{
Triple data[MAXSIZE + 1];
int mu,nu,tu;
}TSMatrix;

Status CreateSMatrix(TSMatrix &M)
{//创建稀疏矩阵
cout << "请输入稀疏矩阵的行,列及非零元素的个数:" << endl;
cin >> M.mu >> M.nu >> M.tu;

if(M.tu > MAXSIZE)
{
cout << "错误,请重新输入:" << endl;
exit(1);
}

cout << "输入非零元素的行,列及值:" << endl;


for(int i = 1; i <= M.tu; i++)
cin >> M.data[i].row >> M.data[i].col >> M.data[i].e;

return OK;
}//CreateSMatrix



void DisplaySMatrix(TSMatrix M)
{//以三元组形式输出稀疏矩阵
for(int i = 1; i <= M.tu; i++)
{
cout << "M[" << M.data[i].row << "][" << M.data[i].col << "]=" << M.data[i].e << setw(5);
}

cout << endl;
}



void OutPutSMatrix(TSMatrix M)
{//输出矩阵,按标准格式输出
int m,n,k = 1;

for(m = 0; m < M.mu; m++)
{
for(n = 0; n < M.nu; n++)
{
if((M.data[k].row - 1) == m && (M.data[k].col - 1) == n)
{
cout << setw(4);
cout << M.data[k++].e;
}

else
{
cout << setw(4);
cout << "0";
}
}
cout<<endl;
}
}//OutPutSMatrix



void FastTransposeSMatrix(TSMatrix M)
{
TSMatrix T; //定义预转置的矩阵
T.tu=M.tu; T.mu=M.nu; T.nu=M.mu;

int * num = new int[M.nu];//分别记录矩阵M中第col列中非零元素的个数
int * cpot = new int[M.nu]; //M中第col列首个非零元在b.data中的位置

if(T.tu)
{
int i,j,t,p,q;

for(i = 0; i < M.nu; i++)
num[i] = 0;
for(t=1;t<=M.tu;t++)
++num[M.data[t].col];

cpot[1]=1;

for(i=2;i<=M.nu;i++)
cpot[i]=cpot[i-1]+num[i-1]; // 求出每一列中非零元素在三元组中出现的位置

for(p=1;p<=M.tu;p++)
{
j=M.data[p].col; q=cpot[j];
T.data[q].row=j; T.data[q].col=M.data[p].row;
T.data[q].e=M.data[p].e; ++cpot[j];
}
}

cout<<"输入矩阵的转置矩阵为"<<endl;
OutPutSMatrix(T);
}//FastTransposeSMatrix



TSMatrix Add(TSMatrix A,TSMatrix B)
{//三元组表示的稀疏矩阵加法
TSMatrix C;
C.mu = A.mu;C.nu = A.nu;C.tu = 0;

int pa = 1,pb = 1,pc = 1;
ElemType ce;

for(int x = 1; x <= A.mu; x++) //对矩阵的每一行进行加法
{
while(A.data[pa].row < x) pa++;
while(B.data[pb].row < x) pb++;
while(A.data[pa].row == x && B.data[pb].row == x)//行列值都相等的元素
{
if(A.data[pa].col == B.data[pb].col)
{
ce = A.data[pa].e + B.data[pb].e;
if(ce)
{
C.data[pc].row = x;
C.data[pc].col = A.data[pb].col;
C.data[pc].e = ce;
pa++;pb++;pc++;
}
}

else if(A.data[pa].col > B.data[pb].col)
{
C.data[pc].row = x;
C.data[pc].col = B.data[pb].col;
C.data[pc].e = B.data[pb].e;
pb++;pc++;
}

else
{
C.data[pc].row = x;
C.data[pc].col = A.data[pa].col;
C.data[pc].e = A.data[pa].e;
pa++;pc++;
}
}//while

while(A.data[pa].row == x) //插入A中剩余的元素(第x行)
{
C.data[pc].row = x;
C.data[pc].col = A.data[pa].col;
C.data[pc].e=A.data[pa].e;
pa++;pc++;
}

while(B.data[pb].row == x) //插入B中剩余的元素(第x行)
{
C.data[pc].row = x;
C.data[pc].col = B.data[pb].col;
C.data[pc].e = B.data[pb].e;
pb++;pc++;
}
}//for
C.tu = pc;

return C;
}//TSMatrix_Add



TSMatrix Multiply(TSMatrix a,TSMatrix b)
{//稀疏矩阵的乘法 a*b
TSMatrix result;//存放运算结果的三元组

if(a.nu != b.mu)
{
cout << "两个矩阵的规格不同!" << endl;
return result;
}

int * rowSize = new int[b.mu]; //矩阵b各行非零元的个数
int * rowStart = new int[b.mu + 1]; //矩阵b各行在三元组开始的地方
ElemType * temp = new ElemType[b.nu]; //暂存每一行的计算结果

int i,Current,lastInResult,RowA,ColA,ColB;

for(i = 0; i < b.mu; i++) rowSize[i] = 0;
for(i = 0; i < b.tu; i++) rowSize[b.data[i].row]++;

rowStart[0] = 0;
for(i = 1; i <= b.mu; i++)
rowStart[i] = rowStart[i - 1] + rowSize[i - 1]; //计算b第i行非零元的起始位置

Current = 0;lastInResult = -1; //a扫描指针及result存指针
while(Current < a.tu) //生成result的当前行temp
{
RowA = a.data[Current].col;
for(i = 0; i < b.nu; i++) temp[i] = 0;

while(Current < a.tu && a.data[Current].row == RowA)
{
ColA = a.data[Current].col; //扫描到当前元素的列号
for(i = rowStart[ColA]; i < rowStart[ColA + 1]; i++)
{
ColB = b.data[i].col;
temp[ColB] += a.data[Current].e * b.data[i].e;
}
Current++;
}

for(i = 0; i < b.nu; i++)
if(temp[i] != 0) //将temp中的非零元压缩到result中去
{
lastInResult++;
result.data[lastInResult].row = RowA;
result.data[lastInResult].col = i;
result.data[lastInResult].e = temp[i];
}
}

result.mu = a.mu;result.nu = b.nu;
result.tu = lastInResult + 1;

delete[] rowSize;delete[] rowStart;delete[] temp;
return result;
}//Multiply



int main()
{
TSMatrix M;
CreateSMatrix(M);
DisplaySMatrix(M);
OutPutSMatrix(M);
FastTransposeSMatrix(M);

TSMatrix a;
CreateSMatrix(a);
OutPutSMatrix(a);

TSMatrix b;
CreateSMatrix(b);
OutPutSMatrix(b);

cout << "矩阵a+b=" << endl;
TSMatrix c;
c = Add(a,b);
OutPutSMatrix(c);

cout << "矩阵a*b=" << endl;
d = Multiply(a,b);
OutPutSMatrix(d);

return 0;
}


用三元组实现的稀疏矩阵,各位帮帮忙,加法和乘法结果都有错误……,查不出错误
谢谢!
...全文
120 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
rose8968 2009-06-19
  • 打赏
  • 举报
回复
哪个高手会java的这道题呀~~ 跟我联系下~~~急用~~~感激不尽~~~ rose8968@yahoo.com.cn
内容概要:本文围绕“新型电力系统下多分布式电源接入配电网承载力评估方法”的研究,系统性地介绍了基于Matlab的仿真建模与代码实现方案,旨在评估高比例分布式电源(如光伏、风电等)接入背景下配电网的接纳能力。研究融合了智能优化算法(如蜣螂优化、灰狼优化、遗传算法)、多目标优化、鲁棒优化及双层优化模型,结合潮流计算、稳定性分析与故障仿真,构建了完整的承载力评估体系。文档不仅提供核心算法实现,还拓展至微电网调度、储能配置、电氢耦合系统、电动汽车协同等前沿方向,强调“复现+创新”相结合的科研路径,助力研究者快速掌握高水平论文复现技巧并激发原创思路。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab/Simulink仿真环境,正在从事科研或工程应用的研究生及初级科研人员(工作1-3年);; 使用场景及目标:①复现高水平期刊中关于配电网承载力的优化模型;②开展高比例可再生能源接入下的配电网规划与运行研究;③学习并应用智能优化算法解决复杂电力系统问题;④获取完整科研资源包以加速课题进展与论文撰写; 阅读建议:建议读者关注公众号“荔枝科研社”获取网盘资源,下载全套代码与模型文件,按照文档结构循序渐进学习,重点理解算法设计逻辑与仿真建模细节,结合所提供的复现案例深化对优化模型与工程应用场景的理解,提升科研效率与创新能力。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧