
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;
}
就这些了不满意也就没办法了
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)