當前位置:首頁 » 編程語言 » 稀疏矩陣轉置c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

稀疏矩陣轉置c語言

發布時間: 2022-10-31 03:17:09

『壹』 編寫用「三元組表」存儲稀疏矩陣,進行矩陣處理的程序。實現(1)矩陣轉置 (2)矩陣相加

矩陣加減注意格式
#include <stdio.h>
#define maxsize 20
typedef int data;
typedef struct
{
int i,j;
data v;
}mat;
typedef struct
{
int m,n,t;
mat dtt[maxsize+1];
}matrix;
matrix a,b,c;
void transmat(matrix a,matrix *b)
{
int p,q,col;
b->m=a.n;
b->n=a.m;
b->t=a.t;
if(a.t!=0)
{
q=1;
for(col=1;col<=a.n;col++)
for(p=1;p<=a.t;p++)
if(a.dtt[p].j==col)
{
b->dtt[q].j=a.dtt[p].i;
b->dtt[q].i=a.dtt[p].j;
b->dtt[q].v=a.dtt[p].v;
q++;
}
}
}
void creat(matrix *x)
{
printf("\nn,m,t=?");
scanf("%d,%d,%d",&x->n,&x->m,&x->t);
for(int i=1;i<=x->t;i++)
{
printf("\ni,j,v=?");
scanf("%d,%d,%d",&x->dtt[i].i,&x->dtt[i].j,&x->dtt[i].v);
}
}
void mout(matrix x)
{
printf("\nn,m,t=");
printf("%d,%d,%d\n",x.n,x.m,x.t);
for(int i=1;i<=x.t;i++)
{
printf("\ni,j,v=");
printf("%d,%d,%d\n",x.dtt[i].i,x.dtt[i].j,x.dtt[i].v);
}
}
void jiajian(matrix x,matrix y,matrix *b)
{
int t;
printf("\n1加");
printf("\n2減\n\n");
scanf("%d",&t);
if(t==1)
{
int s=0,j=1,z=1;
b->m=x.m;
b->n=x.n;
for(int i=1;i<=b->n;i++)
{
for(;j<=x.t,z<=y.t;)
{
if(x.dtt[j].i!=i&&y.dtt[z].i!=i)
{
break;
}
else if(x.dtt[j].i!=i)
{
s++;
b->dtt[s].i=i;
b->dtt[s].j=y.dtt[z].j;
b->dtt[s].v=y.dtt[z].v;
z++;
}
else if(y.dtt[z].i!=i)
{
s++;
b->dtt[s].i=i;
b->dtt[s].j=x.dtt[j].j;
b->dtt[s].v=x.dtt[j].v;
j++;
}
else if(x.dtt[j].j>y.dtt[z].j)
{
s++;
b->dtt[s].i=i;
b->dtt[s].j=y.dtt[z].j;
b->dtt[s].v=y.dtt[z].v;
z++;
}
else if(x.dtt[j].j==y.dtt[z].j)
{
s++;
b->dtt[s].i=i;
b->dtt[s].j=y.dtt[z].j;
b->dtt[s].v=y.dtt[z].v+x.dtt[j].v;
z++;
j++;
}
else if(x.dtt[j].j<y.dtt[z].j)
{
s++;
b->dtt[s].i=i;
b->dtt[s].j=x.dtt[j].j;
b->dtt[s].v=x.dtt[j].v;
j++;
}
}
}
b->t=s;
}
else if(t==2)
{
int s=0,j=1,z=1;
b->m=x.m;
b->n=x.n;
for(int i=1;i<=b->n;i++)
{
for(;j<=x.t,z<=y.t;)
{
if(x.dtt[j].i!=i&&y.dtt[z].i!=i)
{
break;
}
else if(x.dtt[j].i!=i)
{
s++;
b->dtt[s].i=i;
b->dtt[s].j=y.dtt[z].j;
b->dtt[s].v=-y.dtt[z].v;
z++;
}
else if(y.dtt[z].i!=i)
{
s++;
b->dtt[s].i=i;
b->dtt[s].j=x.dtt[j].j;
b->dtt[s].v=x.dtt[j].v;
j++;
}
else if(x.dtt[j].j>y.dtt[z].j)
{
s++;
b->dtt[s].i=i;
b->dtt[s].j=y.dtt[z].j;
b->dtt[s].v=-y.dtt[z].v;
z++;
}
else if(x.dtt[j].j==y.dtt[z].j)
{
if(x.dtt[j].v-y.dtt[z].v!=0)
{
s++;
b->dtt[s].i=i;
b->dtt[s].j=y.dtt[z].j;
b->dtt[s].v=x.dtt[j].v-y.dtt[z].v;
}
z++;
j++;
}
else if(x.dtt[j].j<y.dtt[z].j)
{
s++;
b->dtt[s].i=i;
b->dtt[s].j=x.dtt[j].j;
b->dtt[s].v=x.dtt[j].v;
j++;
}
}
}
b->t=s;
}
}
int main(int argc, char *argv[])
{
printf("1創建\n");
printf("2轉置\n");
printf("3矩陣加減\n");
printf("4退出\n");
printf("\n\n\n");
int t;
while(~scanf("%d",&t))
{
if(t==1)
{
creat(&a);
}
else if(t==2)
{
transmat(a,&b);
mout(b);
}
else if(t==3)
{
creat(&c);
jiajian(a,c,&b);
mout(b);
}
else if(t==4)
break;
printf("\n\n\n");
printf("1創建\n");
printf("2轉置\n");
printf("3矩陣加減\n");
printf("4退出\n");
printf("\n\n\n");
}

return 0;
}

『貳』 c語言矩陣轉置問題

其實只是小問題,你自己都編的很好了。就是保存屏幕不在按入Q和Enter鍵屏幕不會馬上消失上面有問題:
你可以用兩個getchar()函數來讀取鍵盤輸入,前一個數緩沖enter鍵,後一個等待鍵盤輸入,然後屏幕消失!
代碼已修改,如下:
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 20 /*矩陣中最大非零元的個數*/
typedef struct triple
{
int i; /*行標,本程序中從1開始的*/
int j; /*列標,本程序中從1開始的*/
int e; /*非零元*/
}Triple; /*三元組定義*/

typedef struct tabletype
{
int mu; /*矩陣的行數*/
int nu; /*列數*/
int tu; /*非零元個數*/
Triple data[MAXSIZE+1]; /*非零元的三元組表,*/
}Tabletype; /*三元組線性表*/

void out_matrix(Tabletype *); /*輸出 矩陣*/

/*以下為轉置程序,將a所指矩陣轉置,將結果存入b所指的矩陣中*/
int TransposeSMatrix(Tabletype *,Tabletype *);
int main( void )
{
char ch;

while(1)
{
printf(" @@@@@@@@@@本程序的功能是實現稀疏矩陣的普通轉置@@@@@@@@@@@@@@@@@@@\n");
printf(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
/*源矩陣a*/
Tabletype a= {6,7,8,{ {1,2,12},{1,3,9},{3,1,-3},{3,6,14},{4,3,24},{5,2,18},{6,1,15},{6,4,-7} }};
Tabletype b; /*聲明矩陣b*/
printf("The source Matrix:\n");
out_matrix(&a);
if(TransposeSMatrix(&a,&b)) /*若a不為零矩陣則轉置a,存入b中*/
{ printf("After TransposeSMatrix: \n");
out_matrix(&b);
}
else
{
printf("The matrix is zeros:\n");
out_matrix(&a);
}
do{
printf("Input 'q' to quit and ENTER run again:");
if((ch = getchar()) == 'q' || ch == 'Q')
getchar(); //讀取enter
getchar();//任意字元
exit(0);
}while(ch!='\n');
system("cls");
}
return 1;
}

void out_matrix(Tabletype *a) /* 列印矩陣*/
{
int i,j,k = 0;

for(i = 1 ;i <= a->mu; i++)
{
for(j = 1; j<= a->nu; j++)
{ /*判斷是否為非零元*/
if((a->data[k].i == i)&&(a->data[k].j == j))
{
printf("%4d",a->data[k].e);
k++;
}
else
printf("%4d",0);
}
printf("\n");
}
}

int TransposeSMatrix(Tabletype *a,Tabletype *b)
{
int p,q,col;
b->mu = a->nu; /*原矩陣的行數為新矩陣的列數,願列數為新行數,非零元個數不變*/
b->nu = a->mu;
b->tu = a->tu;
if(b->tu) /*若a不為零矩陣*/
{
q = 0; /*b->data下標*/
for(col = 1; col < a->nu; col++)
for(p = 0;p < a->tu;p++) /*p為a->data的下標*/
if(col == a->data[p].j) /*按b->data[q]中的列標對a->data[p]進行掃描*/
{
b->data[q].i = a->data[p].j;
b->data[q].j = a->data[p].i;
b->data[q].e = a->data[p].e;
q++;
}
return 1;
}
else /*a為零矩陣*/
return 0;
}

不知道是不是你的要求。希望能幫助你!

『叄』 採用基於稀疏矩陣的三元組壓縮存儲方法,實現m×n矩陣的快速轉置

#include<iostream>
using
namespace
std;
class
matrix
{
public:
int
data[100][100];
int
m,n;
};
typedef
int
spmatrix[100][3];
void
Init(matrix&
mx);//稀疏矩陣初始化
void
SpmDisplay(spmatrix
spm);//顯示三元組表示的矩陣
void
Compressmatrix(matrix
A,spmatrix
B);//將稀疏矩陣轉換為三元組矩陣
void
Transpmatrix(spmatrix
B,spmatrix&
C);//將三元組矩陣轉置
int
main()
{
matrix
mx;
spmatrix
spm1,spm2;
//矩陣初始化
Init(mx);
//矩陣轉為三元組
Compressmatrix(mx,spm1);
//顯示三元組矩陣
SpmDisplay(spm1);
//將三元組轉置存放到spm2中
Transpmatrix(spm1,spm2);
//顯示轉置後的三元組
SpmDisplay(spm2);
return
0;
}

『肆』 稀疏矩陣三元組表示以及轉置

visual studio下編譯通過,測試結果正確,萬一VC6編譯不過請用TC2.0
//稀疏矩陣就是只記錄非零元的位置和值,適合處理0比較多的矩陣
#include <stdio.h>
#include <malloc.h>

#define MAXSIZE 10

typedef struct node
{
int i,j,value; //i為行下標,j為列下標,value為該處的值
}NODE;
typedef struct mat
{
int mv,mc,mt; //mv為行數,mc為列數,mt為非零元個數
NODE v[MAXSIZE];
}MAT;
//view為輸出稀疏矩陣
void view(MAT *a)
{
printf("矩陣的三元組表示:\n");
printf("i j v\n");
for(int k=0;k<a->mt;k++)
printf("%-6d%-6d%-6d\n",a->v[k].i,a->v[k].j,a->v[k].value);

}
//init為輸入一個矩陣並存為稀疏矩陣
void init(MAT *a)
{
int k=0; //非零元的序號
//for(k=0;k<MAXSIZE;k++)
// a->v[k].value=0; //先都初始化為零
a->mt=0;
printf("請輸入行數和列數:\n");
scanf("%d%d",&a->mv,&a->mc);
printf("\n請依次輸入矩陣的各個元素的值:\n");
for(int m=1;m<=a->mv;m++)
for(int n=1;n<=a->mc;n++)
{
int t;
scanf("%d",&t);
//如果t為非零元,存入v[k]中
if(t!=0)
{
a->v[k].i=m;
a->v[k].j=n;
a->v[k].value=t;
a->mt++;
k++;
}
}
}
//矩陣a轉置後存入矩陣b
void change(MAT *a,MAT *b)
{
b->mv=a->mc;
b->mc=a->mv;
b->mt=a->mt;
if(a->mt)
{
int p=0,q=0;
for(int n=1;n<=a->mc;n++)
for(int p=0;p<=a->mc;p++)
{
if(a->v[p].j==n) //v[p]是第n列的非零元
{
b->v[q].i=a->v[p].j;
b->v[q].j=a->v[p].i;
b->v[q].value=a->v[p].value;
q++;
}
}
}
}
void main()
{
MAT *a,*b;
b=(MAT *)malloc(sizeof(MAT));
a=(MAT *)malloc(sizeof(MAT));
init(a);
view(a);
change(a,b);
view(b);
}

『伍』 用十字鏈表存儲結稀疏矩陣,並進行矩陣的轉置。 要C的,c++的我看不懂。。。。~

這個吧 功能比你要的還多:http://wenku..com/view/3d744dd950e2524de5187e68.html
建立稀疏矩陣A 的十字鏈表首先輸入的信息是:m(A 的行數),n(A 的列數),r(非零項的數目),緊跟著輸入的是r 個形如(i,j,aij)的三元組。

演算法的設計思想是:首先建立每行(每列)只有頭結點的空鏈表,並建立起這些頭結點拉成的循環鏈表;然後每輸入一個三元組(i,j,aij),則將其結點按其列號的大小插入到第i 個行鏈表中去,同時也按其行號的大小將該結點插入到第j 個列鏈表中去。在演算法中將利用一個輔助數組MNode *hd[s+1]; 其中s=max(m , n) , hd [i]指向第i 行(第i 列)鏈表的頭結點。這樣做可以在建立鏈表時隨機的訪問任何一行(列),為建表帶來方便。

演算法如下:
MLink CreatMLink( ) /* 返回十字鏈表的頭指針*/

MLink H;
Mnode *p,*q,*hd[s+1];
int i,j,m,n,t;
datatype v;
scanf(「%d,%,%d」,&m,&n,&t);
H=malloc(sizeof(MNode)); /*申請總頭結點*/
H->row=m; H->col=n;
hd[0]=H;
for(i=1; i<S; i++)
{ p=malloc(sizeof(MNode)); /*申請第i 個頭結點*/
p->row=0; p->col=0;
p->right=p; p->down=p;
hd[i]=p;
hd[i-1]->v_next.next=p;
}
hd[S]->v_next.next=H; /*將頭結點們形成循環鏈表*/
for (k=1;k<=t;k++)
{ scanf (「%d,%d,%d」,&i,&j,&v); /*輸入一個三元組,設值為int*/
p=malloc(sizeof(MNode));
p->row=i ; p->col=j; p->v_next.v=v
/*以下是將*p 插入到第i 行鏈表中去,且按列號有序*/
q=hd[i];
while ( q->right!=hd[i] && (q->right->col)<j ) /*按列號找位置*/
q=q->right;
p->right=q->right; /*插入*/
q->right=p;
/*以下是將*p 插入到第j 行鏈表中去,且按行號有序*/
q=hd[i];
while ( q->down!=hd[j] && (q->down->row)<i ) /*按行號找位置*/
q=q->down;
p-> down =q-> down; /*插入*/
q-> down =p;
} /*for k*/
return H;
} /* CreatMLink */

『陸』 稀疏矩陣與轉置演算法

#include<stdio.h>
#include<stdlib.h>

typedefstruct{
introw;
intcol;
intdata;
}xishu;//存儲稀疏矩陣的結構(行,列,值)


#defineMAX_COL10
//staticvoidtranspose(xishua[],xishub[]);//普通演算法

staticvoidfasttranspose(xishua[],xishub[]);//改進的演算法

staticvoidcreate(inta[][6],intm,intn,xishub[],int*count);
staticvoidprint(int*count,xishua[]);

intmain(intargc,char**argv)
{
inta[6][6]={{0,0,0,22,0,-1},{0,71,0,0,0,0},{0,0,0,88,0,0},
{0,0,-9,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,7}};
xishub[10],c[10];
intcount=0,i,k;

for(i=0;i<10;i++){
b[i].row=c[i].row=0;
b[i].col=c[i].col=0;
b[i].data=c[i].data=0;
}//初始化


create(a,6,6,b,&count);//建立一個以xishu為元素的數組來表示一個稀疏矩陣

printf(" beforetranpose ");
print(&count,b);//列印建立好的稀疏矩陣


//transpose(b,c);

fasttranspose(b,c);//建立轉置矩陣

printf(" aftertranspos ");
print(&count,c);//列印轉置矩陣

exit(0);
}

staticvoidprint(int*count,xishua[])
{
intk;

for(k=1;k<=*count;k++){
printf("%d %d %d ",a[k].row,a[k].col,a[k].data);
}
}

staticvoidcreate(inta[][6],intm,intn,xishub[],int*count)
{
inti,j;

*count=0;
b[0].row=m;
b[0].col=n;

for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(a[i][j]!=0){
(*count)++;
b[*count].row=i;
b[*count].col=j;
b[*count].data=a[i][j];
}
}
}
b[0].data=*count;
}

/***
staticvoidtranspose(xishua[],xishub[])
{
//該演算法的時間代價為O(a[0].data*a[0].data)

intcount=0;
inti,col;

b[0].row=a[0].col;
b[0].col=a[0].row;
b[0].data=a[0].data;
printf("%d,%d,%d ",b[0].row,b[0].col,b[0].data);
printf("%d,%d,%d ",a[0].row,a[0].col,a[0].data);

for(col=0;col<a[0].col;col++){
for(i=1;i<=a[0].data;i++){
if(a[i].col==col){
count++;
b[count].row=a[i].col;
b[count].col=a[i].row;
b[count].data=a[i].data;
}
}
}
}
***/
staticvoidfasttranspose(xishua[],xishub[])
{
//改進的演算法,該演算法的時間代價為O(a[0].col+a[0].data)

inti,pos;
introw_num[MAX_COL];
intstart_pos[MAX_COL];

b[0].row=a[0].col;
b[0].col=a[0].row;
b[0].data=a[0].data;

for(i=0;i<a[0].col;i++){
row_num[i]=0;
}
for(i=1;i<=a[0].data;i++){
row_num[a[i].col]++;
}

start_pos[0]=1;
for(i=1;i<a[0].col;i++){
start_pos[i]=start_pos[i-1]+row_num[i-1];
}

for(i=1;i<=a[0].data;i++){
pos=start_pos[a[i].col];
while(b[pos].data!=0){
pos++;
}
b[pos].row=a[i].col;
b[pos].col=a[i].row;
b[pos].data=a[i].data;
}
}

『柒』 關於稀疏矩陣的數組存儲表示,轉置,輸出

#include<iostream>
using std::cout;
using std::cin;
using std::endl;
struct node
{
int r;//行標
int c;//列標
double dat;//數據
};
class triple
{
private:
int row;//行數
int col;//列數
int num;//非零個數
node *ptr;//存放數組的首地址
public:
triple(int co,int ro,int nu):col(co),row(ro),num(nu)
{
ptr=new node[num];//分配num,盛放num個元素
cout<<"請輸入"<<num<<"個三元組元素\n"<<"格式為: 2 3 6.7\n其中2為行標,3為列標,6.7為數據元素"<<endl;
for(int i=0;i<num;i++)
{
cin>>ptr[i].r;
cin>>ptr[i].c;
cin>>ptr[i].dat;
}
}
~triple(){delete[]ptr;}
void print()
{
int flag=ptr[0].r;
cout<<"第"<<flag<<"行元素為:";
for(int i=0;i<num;i++)
{
if(ptr[i].r!=flag)
{
cout<<"\n";
flag=ptr[i].r;
cout<<endl;
cout<<"第"<<flag<<"行元素為:";
}
cout<<"("<<ptr[i].r<<","<<ptr[i].c<<","<<ptr[i].dat<<") ";
}
}
void transpose()
{
int flag=0;
for(int i=1;i<=col;i++)
{
for(int j=0;j<num;j++)
{
if(ptr[j].c==i)
{
if(flag!=ptr[j].c)
{
flag=ptr[j].c;
cout<<"\n第"<<ptr[j].c<<"行為:";
}
cout<<"("<<ptr[j].c<<","<<ptr[j].r<<","<<ptr[j].dat<<") ";
}
}
}
}
};
void main()
{
cout<<"請輸入數組的行列和元素個數:\n";
int a[3];
for(int i=0;i<3;i++)
{
cin>>a[i];
}
triple t(a[0],a[1],a[2]);
t.print();//輸出原矩陣
cout<<"轉制後的矩陣為:";
t.transpose();
}

『捌』 用C語言編寫一個矩陣運算的程序,高分!

//矩陣三元組之矩陣相加 相乘
#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;
}

『玖』 c++ 實現稀疏矩陣創建(從文件方式)

C++稀疏矩陣轉置代碼:

#include<iostream>
002usingnamespacestd;
003//三元組
004structTrituple
005{
006introw,col;//非零元素的行號、列號
007intval;//非零元素的值
008};
009//稀疏矩陣類聲明
010classSparseMatrix
011{
012//friendostream&operator<<(ostream&,SparseMatrix&);
013//友元函數,輸出流操作符重載
014//friendistream&operator>>(istream&,SparseMatrix&);
015//友元函數,輸入流操作符重載
016public:
017SparseMatrix(intmaxt=100);//構造函數
018~SparseMatrix();//析構函數
019boolTransposeTo(SparseMatrix&);//轉置
020boolTransposeTo_Faster(SparseMatrix&);//快速轉置
021voidAddTo(constSparseMatrix&);//加運算
022boolInput();//輸入稀疏矩陣
023voidOutput();//輸出稀疏矩陣
024private:
025Trituple*data;//存儲非零元素三元組的數組
026introws,cols,terms;//矩陣的行數、列數、非零元素個數
027intmaxterms;//數組data的大小
028};
029//構造函數,分配maxt個三元組結點的順序空間,構造一個空的稀疏矩陣三元組表。
030SparseMatrix::SparseMatrix(intmaxt)
031{
032maxterms=maxt;
033data=newTrituple[maxterms];
034terms=rows=cols=0;
035}//SparseMatrix
036//析構函數,將三元組表結構銷毀。
037SparseMatrix::~SparseMatrix()
038{
039if(data!=NULL)delete[]data;
040}//~SparseMatrix
041/*//輸出稀疏矩陣
042ostream&operator<<(ostream&out,SparseMatrix&M)
043{
044out<<"rows="<<M.rows<<endl;
045out<<"cols="<<M.cols<<endl;
046out<<"terms="<<M.terms<<endl;
047for(inti=0;i<M.terms;i++)
048out<<"data["<<M.data[i].row<<","<<M.data[i].col<<"]="<<M.data[i].val<<endl;
049returnout;
050};
051//輸入稀疏矩陣
052istream&operator>>(istream&in,SparseMatrix&M)
053{
054cout<<"輸入稀疏矩陣的行數、列數以及非零元素個數"<<endl;
055in>>M.rows>>M.cols>>M.terms;
056if(M.terms>M.maxterms)exit(1);
057cout<<"terms="<<M.terms<<endl;
058for(inti=0;i<M.terms;i++){
059cout<<"輸入非零元素的行號、列號和元素值"<<i+1<<endl;
060in>>M.data[i].row>>M.data[i].col>>M.data[i].val;
061}
062returnin;
063};*/
064//轉置,將*this的轉置矩陣送入B
065boolSparseMatrix::TransposeTo(SparseMatrix&B)
066{
067if(terms>B.maxterms)
068returnfalse;
069B.rows=cols;
070B.cols=rows;
071B.terms=terms;
072if(terms>0){
073intp=0;
074for(intj=1;j<=cols;j++)
075for(intk=0;k<terms;k++)
076if(data[k].col==j){
077B.data[p].row=j;
078B.data[p].col=data[k].row;
079B.data[p].val=data[k].val;
080p++;
081}
082}
083returntrue;
084}//TransposeTo
085//快速轉置,將*this的轉置矩陣送入B
086boolSparseMatrix::TransposeTo_Faster(SparseMatrix&B)
087{
088if(terms>B.maxterms)
089returnfalse;
090B.rows=cols;
091B.cols=rows;
092B.terms=terms;
093if(terms>0){
094int*num,*cpot;
095intj,k,p;
096num=newint[cols];
097cpot=newint[cols];
098for(j=0;j<cols;j++)//初始化num[]
099num[j]=0;
100for(k=0;k<terms;k++)//統計每一列的非零元素個數num[]
101num[data[k].col-1]++;
102//求出B中每一行的起始下標cpot[]
103cpot[0]=0;
104for(j=1;j<cols;j++)
105cpot[j]=cpot[j-1]+num[j-1];
106//執行轉置操作
107for(k=0;k<terms;k++){
108p=cpot[data[k].col-1]++;//B中的位置
109B.data[p].row=data[k].col;
110B.data[p].col=data[k].row;
111B.data[p].val=data[k].val;
112}
113delete[]num;
114delete[]cpot;
115}
116returntrue;
117}//TransposeTo_Faster
118//輸入稀疏矩陣
119boolSparseMatrix::Input()
120{
121cout<<"輸入稀疏矩陣的行數、列數以及非零元素個數"<<endl;
122cin>>rows>>cols>>terms;
123if(terms>maxterms){
124cout<<"非零元個數太多!"<<endl;
125returnfalse;
126}
127if(terms==0)
128returntrue;
129cout<<"按行序輸入"<<terms<<"個非零元素的三元組"<<endl;
130for(inti=0;i<terms;i++){
131cout<<"輸入第"<<i+1<<"個非零元素的行號、列號和元素值"<<endl;
132cin>>data[i].row>>data[i].col>>data[i].val;
133if(data[i].row<1||data[i].row>rows||data[i].col<1||data[i].col>cols){
134cout<<"矩陣輸入有誤!"<<endl;
135returnfalse;
136}
137}
138returntrue;
139}//Input
140//輸出稀疏矩陣
141voidSparseMatrix::Output()
142{
143cout<<"rows="<<rows<<endl;
144cout<<"cols="<<cols<<endl;
145cout<<"terms="<<terms<<endl;
146for(inti=0;i<terms;i++)
147cout<<"data["<<data[i].row<<","<<data[i].col<<"]="<<data[i].val<<endl;
148}//Output
149intmain()
150{
151SparseMatrixM(100);
152if(M.Input()){
153cout<<"原始矩陣:"<<endl;
154M.Output();
155SparseMatrixT,S;
156cout<<"轉置矩陣:"<<endl;
157if(M.TransposeTo(T))
158T.Output();
159if(M.TransposeTo_Faster(S))
160S.Output();
161system("pause");
162return1;
163}
164else
165return0;
166}