稀疏矩阵相乘的问题

稀疏矩阵相乘的问题,第1张

1它这个程序中,数组的下标为0的元素都是不用的,所有声明时长度要+1

2ctemp是用来作乘法时,累积求和用的既然是求和用的,初始化肯定是0假设是2x3矩阵和3x4矩阵相乘前者的每行要和后者的4列分别相乘,所以ctemp的长度要设为4+1=5

3这个乘法函数是逐行计算的,每算完1行,Qtu就记录了目前为止已经得到的非零元的个数,所以新行的rpos肯定是Qtu+1这点从最后的

if(ctemp[ccol])

{

if(++Qtu>MAXSIZE)

return 0;

就可以看的出来,每得到一个非零元,就要执行一次++Qtu

4这个Create函数有点问题,如果第一行没有非零元的话,我个人认为应该将Mrpos[1]设为0当然,为了不影响其他行的计算,可以在其他行算完后,再由

if(num[1]==0) Mrpos[1]=0;来设置

#include <iostreamh>

#define EPS 10E-8 //很小的数认为是零元素

class elem{ //定义矩阵元素类

int col;

float data;

public:

elem next; //行链接

elem(int c,float d,elem nx=NULL){col=c;data=d;next=nx;};

elem(){col=0;data=0;next=NULL;};

~elem(){cout<<"del "<<col<<" "<<data<<" ";delete next;next=NULL;};

float getdata(){return data;};

int getcol(){return col;}

int setcol(int c){return(col=c);};

float setdata(float d){return(data=d);};

};

class coeffmatrix{ //稀疏矩阵类

int N; //行数

int M; //列数

elem Row; //行链接点列表 全零行指针为NULL

public:

coeffmatrix(int n,int m){

N=n;

M=m;

Row=new elem [n];

for(int i=0;i<N;i++){

Row[i]=NULL;

}

};

coeffmatrix(){ //无参构造函数 建立空矩阵

N=0;M=0;Row=NULL;

};

coeffmatrix(coeffmatrix & m){ //拷贝构造函数

N=mN;M=mM;Row=new elem [N];

for(int i=0;i<N;i++){

if(mRow[i]!=NULL){

Row[i]=NULL;

}else{

elem p=mRow[i];

elem q=new elem(p->getcol(),p->getdata());

elem s=q;

Row[i]=q;

p=p->next;

while(p){

q=new elem(p->getcol(),p->getdata());

s->next=q;

s=q;

p=p->next;

}

}

}

};

~coeffmatrix(){

if(N!=0){

if(Row!=NULL){

for(int i=0;i<N;i++){

if(Row[i]!=NULL){

delete Row[i];

Row[i]=NULL;

}

}

delete Row;

Row=NULL;

}

}

}

bool reset(int n,int m){ //扩展行列数,原内容不破坏,

if(n==N && m==M)return true;

if(n<N || m<M)return false;

cout<<endl;

elem p=Row;

elem Rx=new elem [n];

for(int i=0;i<n;i++){

if(i<N){

Rx[i]=Row[i];

}else{

Rx[i]=NULL;

}

}

delete p ;

Row=Rx;

N=n;M=m;

return true;

};

float set_elem(int r,int c,float d){ //元素赋值

if ((r>N || c>M)||(r<1||c<1))return 0;

if(Row==NULL)return 0;

if(d<EPS)return 0;

elem p;

p=Row[r-1];

if(p==NULL){

Row[r-1]=new elem(c,d);

return d;

}

do{

if(p->getcol()==c){

p->setdata(d);

return d;

}

if(p->next != NULL){

if(p->next->getcol()>c){

p->next=new elem(c,d,p->next);

return d;

}

}else{

p->next=new elem (c,d);

return d;

}

p=p->next;

}while(p);

};

float add_elem(int r,int c,float d){ //元素+数值

if(r>N || c>M)return 0;

if(d<EPS)return 0;

elem p;

p=Row[r-1];

if(p==NULL){

Row[r-1]=new elem(c,d);

return d;

}

while(p){

if(p->getcol()==c){

p->setdata(p->getdata()+d);

return p->getdata();

}

if(p->next != NULL){

if(p->next->getcol()>c){

p->next=new elem(c,d,p->next);

return d;

}else{

p=p->next;

}

}else{

p->next=new elem (c,d);

return d;

}

};

};

void add(coeffmatrix mat){ //加 矩阵 ;可以行列数不同 ,

//如果需要必须行列数相同才能加,则将

//以下三行改为,行列数验证

int Nx=this->N>mat->NX()this->N:mat->NX();

int Mx=this->M>mat->MX()this->M:mat->MX();

reset(Nx,Mx);

//----

for(int i=1;i<=mat->NX();i++){

for(int j=1;j<=mat->MX();j++){

float d=mat->ELEM(i,j);

add_elem(i,j,d);

}

}

};

void sub(coeffmatrix mat){ //减 矩阵

int Nx=this->N>mat->NX()this->N:mat->NX();

int Mx=this->M>mat->MX()this->M:mat->MX();

reset(Nx,Mx);

for(int i=1;i<=mat->NX();i++){

for(int j=1;j<=mat->MX();j++){

float d=mat->ELEM(i,j);

add_elem(i,j,-d);

}

}

};

int NX(){return N;};

int MX(){return M;};

float ELEM(int n,int m){ //取矩阵元素值 A[n,m]

float a=0;

if(n<=N && n>=1){

if(m<=M && m>=1){

elem p=Row[n-1];

while(p){

if(p->getcol()==m){a=p->getdata();break; }

p=p->next;

}

}

}

return a;

};

void fset(int n,int m){ //强行重置矩阵行列,并所有行为空,即矩阵为全零阵

if(N!=0){

if(Row!=NULL){

for(int i=0;i<N;i++){

if(Row[i]!=NULL){

delete Row[i];

Row[i]=NULL;

}

}

delete Row;

}

}

Row=new elem [n];

for(int i=0;i<n;i++)Row[i]=NULL;

N=n;M=m;

}

bool friend mul(coeffmatrix result,coeffmatrix m1,coeffmatrix m2) //友元函数 矩阵乘法

{

if(m1->MX()!=m2->NX())return false;

int Mp=m1->MX();

int Nx=m1->NX();

int Mx=m2->MX();

result->fset(Nx,Mx);

for(int i=1;i<=Nx;i++){

for(int j=1;j<=Mx;j++){

float s=0;

for(int k=1;k<=Mp;k++){

s+=m1->ELEM(i,k)m2->ELEM(k,j);

}

result->set_elem(i,j,s);

}

}

return true;

}

void show(){ //矩阵显示

cout<<"Matrix "<<N<<" x "<<M<<endl;

for(int i=1;i<=N;i++){

for(int j=1;j<=M;j++){

cout<<ELEM(i,j)<<"\t";

}

cout<<endl;

}

}

};

int main()

{

int NN=5;

coeffmatrix m1(NN,NN);

coeffmatrix m2(NN,NN);

cout<<"setup the matrix"<<endl;

for(int i=1;i<=NN;i++){

for(int j=i;j<=NN;j++){

m1set_elem(i,j,ij);

}

m2set_elem(i,NN-i+1,1);

}

coeffmatrix m3;

m1show();

m2show();

mul(&m3,&m2,&m1);

m3show();

m3add(&m1)

m3show();

}

(这几天事多点,才编出来调试通过,还不大完善,搂主自己再完善一些。希望对已有帮助)

(1)#include <stdioh>

int main()

{

int i,j,k,num;

int arr;

printf("输入非0元素的数量:");

scanf("%d",&num);

arr=(int )malloc(sizeof(int)(num+1)3);

for(i=1;i<=num;i++)

{

printf("输入第%d个三元组数据",i);

scanf("%d%d%d",&arr[i3],&arr[i3+1],&arr[i3+2]);

}

for(i=1;i<=num;i++) //获取稀疏矩阵的行和列

{

if(arr[0]<arr[i3]) arr[0]=arr[i3]; //保存矩阵的行

if(arr[1]<arr[i3+1]) arr[1]=arr[i3+1]; //保存矩阵的列

}

arr[2]=num;//元素数量

printf("稀疏矩阵三元组:\n");

for(i=0;i<=num;i++) //输出三元组数据

{

for(j=0;j<3;j++)

printf("%4d", arr[i3+j]);

printf("\n");

}

printf("稀疏矩阵:\n");

k=1;

for(i=0;i<=arr[0];i++) //稀疏矩阵的行数

{

for(j=0;j<=arr[1];j++) //稀疏矩阵的列数

{

if(i==arr[k3] && j==arr[k3+1] && k<=arr[2])

{

printf("%4d ",arr[k3+2]); //输出非0数据

k++;

}

else

printf("%4d ", 0); //输出0

}

printf("\n");

}

getch();

return 0;

}

三元组形式保存的稀疏矩阵还原为矩阵并输出

(2)#include <stdioh>

void MatrixMul(int a,int b, int c, int x, int y, int z)

{

int i,j,k;

for (j=0;j<y;j++) //清空目标矩阵C的内容

for(i=0;i<x;i++)

c[j][i]=0;

for(j=0;j<y;j++) //进行矩阵乘法运算

for(i=0;i<x;i++)

for(k=0;k<z;k++)

c[j][i]+= a[j][k]b[k][i];

}

int main()

{

int i,j,k,tmp;

int ARow,ACol; //矩阵A的行、列

int BRow,BCol; //矩阵B的行、列

int CRow,CCol; //矩阵C的行列

int a,b,c; //分别指向3个矩阵的内存

printf("输入矩阵A的行数和列数:");//输入矩阵A的行数、列数

scanf("%d %d",&ARow,&ACol);

BRow=ACol; //矩阵B的行数等于矩阵A的列数

printf("输入矩阵B的列数:");//输入矩阵B的列数

scanf("%d",&BCol);

CRow=ARow; //目标矩阵C的行数

CCol=BCol; //目标矩阵C的列数

c=(int )malloc(sizeof(int )CRow); //分配保存矩阵C的二级指针存储空间

for(j=0;j<CRow;j++) //分配一级指针内存空间

c[j]=(int )malloc(sizeof(int)CCol);

a=(int )malloc(sizeof(int )ARow);//分配保存矩阵A的二级指针

for(j=0;j<ARow;j++)

a[j]=(int )malloc(sizeof(int)ACol);

b=(int )malloc(sizeof(int )BRow); //分配保存矩阵B的二级指针

for(j=0;j<BRow;j++)

b[j]=(int )malloc(sizeof(int)BCol);

if(!b[BRow-1]) //判断内存是否分配成功

{

printf("分配内存失败!\n");

exit(0);

}

printf("输入矩阵A的数据(%d行%d列):\n",ARow,ACol);//输入A阵元素

for(j=0;j<ARow;j++)

for (i=0;i<ACol;i++)

{

scanf("%d",&tmp);

a[j][i]=tmp;

}

printf("输入矩阵A的数据(%d行%d列):\n",BRow,BCol);//输入B阵元素

for(j=0;j<BRow;j++)

for (i=0;i<BCol;i++)

{

scanf("%d",&tmp);

b[j][i]=tmp;

}

MatrixMul(a,b,c,CCol,CRow,ACol);//调用矩阵乘法函数

printf("矩阵相乘的结果:\n");

for(j=0;j<CRow;j++) //输出矩阵乘法结果

{

for(i=0;i<CCol;i++)

printf("%d ",c[j][i]);

printf("\n");

}

getch();

return 0;

}

矩阵乘法

(3)

多维矩阵转一维矩阵(以2维为例)

#include <stdioh>

#include <stdlibh>

int main()

{

int row, column,i,ARow,ACol,loc,tmp;

int arr1,arr2; //分别指向2个矩阵的内存

printf("输入矩阵的行数和列数:");//输入矩阵A的行数、列数

scanf("%d %d",&ARow,&ACol);

arr1=(int )malloc(sizeof(int )ARow); //分配保存矩阵的二级指针存储空间

for(i=0;i<ARow;i++) //分配一级指针内存空间

arr1[i]=(int )malloc(sizeof(int)ACol);

arr2=(int )malloc(sizeof(int)ARowACol);//分配保存一维矩阵的存储空间

if(arr1==NULL) //判断内存是否分配成功

{

printf("分配内存失败!\n");

exit(0);

}

printf("输入二维矩阵的数据(%d行%d列):\n",ARow,ACol);//输入A阵元素

for(row=0;row<ARow;row++)

for(column=0;column<ACol;column++)

{

scanf("%d",&tmp);

arr1[row][column]=tmp;

}

printf("\n以行为主转换为一维矩阵:\n");

for(row=0;row<ARow;row++)//按行循环

{

for(column=0;column<ACol;column++) //按列循环

{

loc=column+rowACol; //转换为一维矩阵的序号

arr2[loc]=arr1[row][column]; //保存元素

}

}

for(i=0;i<ARowACol;i++) //输出一维矩阵

printf("%d ", arr2[i]);

printf("\n以列为主转换为一维矩阵:\n");

for(column=0;column<ACol;column++)

{

for(row=0;row<ARow;row++)

{

loc=row+columnARow; //转换为一维矩阵的序号

arr2[loc]=arr1[row][column]; //保存元素

}

}

for(i=0;i<ARowACol;i++) //输出一维矩阵

printf("%d ", arr2[i]);

printf("\n");

getch();

return 0;

}

就这些了不满意也就没办法了

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

原文地址:https://54852.com/langs/11671250.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存