題目:
內(nèi)容:稀疏矩陣運(yùn)算器
要求:使用三元組順序表存儲(chǔ)矩陣;實(shí)現(xiàn)矩陣的逆置、加、減、乘運(yùn)算;具有相應(yīng)的報(bào)錯(cuò)處理。
本人采用C++來書寫該數(shù)據(jù)結(jié)構(gòu)的題目,有興趣的同學(xué)可以了解一下需要掌握一定的封裝的能力。
類的結(jié)果存儲(chǔ)如下所示:
class ju{
struct shu{
int i,j;
int x;
};
int m,n;
int len;
shu a[25];
public:
int juzhen[10][10]; //矩陣內(nèi)容的存儲(chǔ)
ju(int o,int p); //矩陣的初始化賦值
void print()const;
void generate(); //保存轉(zhuǎn)置后的矩陣
void get_three(); //獲得計(jì)算結(jié)束的三元組
int get_m()const;
int get_n()const;
ju Invert(ju y,ju c); //轉(zhuǎn)置函數(shù)
ju& add(ju c,ju &y); //矩陣加法
ju& minus(ju c,ju &y); //矩陣減法
ju& multi(ju c,ju &y); //矩陣乘法
};
加減法的函數(shù)內(nèi)容如下所示:
?其中的運(yùn)算最容易實(shí)現(xiàn)的就是加減法,本人采取類成員函數(shù)的方式來進(jìn)行計(jì)算,使用一個(gè)類的引用使其可以在函數(shù)體內(nèi)部對(duì)其本身進(jìn)行修改返回一個(gè)引用值可以避免程序開辟一個(gè)臨時(shí)變量來浪費(fèi)內(nèi)存。具體的實(shí)現(xiàn)內(nèi)容則是進(jìn)行循環(huán)將其相應(yīng)位置進(jìn)行加減法的運(yùn)算即可
ju & ju::add(ju c,ju &y)
{
int m1,n1;
m1=c.get_m();
n1=c.get_n();
if(m!=m1||n!=n1){
cout<<"您輸入的矩陣格式不匹配\n";
return *this;
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
y.juzhen[i][j]=juzhen[i][j]+c.juzhen[i][j];
}
}
return y;
}
ju & ju::minus(ju c,ju &y)
{
int m1,n1;
m1=c.get_m();
n1=c.get_n();
if(m!=m1||n!=n1){
cout<<"您輸入的矩陣格式不匹配\n";
return *this;
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
y.juzhen[i][j]=juzhen[i][j]-c.juzhen[i][j];
}
}
return y;
}
乘法的函數(shù)如下:
該函數(shù)實(shí)現(xiàn)的功能是矩陣的乘法,我們?cè)诰€性代數(shù)中學(xué)習(xí)到的只有當(dāng)前一項(xiàng)的列等于后一項(xiàng)的行時(shí)才可以進(jìn)行相關(guān)的乘法,并且乘法規(guī)律則是第一行乘以第一列并且求和等于結(jié)果矩陣的1,1位置第一行乘以對(duì)應(yīng)相乘第二列并且求和等于1.2位置以此類推。大家可以在紙上進(jìn)行驗(yàn)算之后可知需要三次循環(huán)來存儲(chǔ)結(jié)果的內(nèi)容,其內(nèi)容如下所示。
ju& ju::multi(ju c,ju &y)
{
if(n!=c.m)
cout<<"您輸入的格式存在問題無法進(jìn)行計(jì)算\n";
for(int i=1;i<=m;i++)
{
for(int j=1;j<=c.n;j++)
{
for(int k=1;k<=c.m;k++)
y.juzhen[i][j]+=juzhen[i][k]*c.juzhen[k][j];
}
}
return y;
}
下來是轉(zhuǎn)置并且保存結(jié)果矩陣的:
下面是稀疏矩陣的快速轉(zhuǎn)置的實(shí)現(xiàn),我們首先要定義兩個(gè)數(shù)組來存儲(chǔ)每一列具有多少個(gè)元素并且記錄該列將轉(zhuǎn)置到三元組的第幾個(gè)位置,num數(shù)組則是存儲(chǔ)一列具有多少個(gè)元素,position將記錄轉(zhuǎn)置到第幾個(gè)位置。generate()則是獲取存儲(chǔ)該結(jié)果的矩陣。
?
?
void ju::generate()
{
int k,i,j;
juzhen[10][10]={0};
for(k=1;k<=len;k++){
i=a[k].i;
j=a[k].j;
juzhen[i][j]=a[k].x;
}
}
ju ju::Invert(ju y,ju c)
{
int a,b;
int num[20],position[20];
for(a=1;a<=c.len;a++)
{
num[a]=0;
position[a]=0;
}
for(a=1;a<=c.m;a++)
{
for(b=1;b<=c.n;b++)
{
if(juzhen[b][a]!=0)
{
num[b]++;
}
}
}
position[1]=1;
for(a=2;a<=len;a++)
{
position[a]=num[a-1]+position[a-1];
}
for(b=1;b<=c.len;b++)
{
int col=c.a[b].j;
int q=position[col];
y.a[q].i=c.a[b].j;
y.a[q].j=c.a[b].i;
y.a[q].x=c.a[b].x;
y.len++;
y.m=c.n;
y.n=c.m;
++position[col];
}
return y;
}
整體性的代碼如下所示,如果需要取走的朋友們請(qǐng)給個(gè)贊或者留個(gè)言謝謝
#include<iostream>
using namespace std;
int flag1=1;
int flag2=1;
int flag3=1;
class ju{
struct shu{
int i,j;
int x;
};
int m,n;
int len;
shu a[25];
public:
int juzhen[10][10];
ju(int o,int p);
void print()const;
void print1()const;
void generate();
void get_three();
int get_m()const;
int get_n()const;
ju Invert(ju y,ju c);
ju& add(ju c,ju &y);
ju& minus(ju c,ju &y);
ju& multi(ju c,ju &y);
};
void ju::get_three()
{
int i,j;
int k=1;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(juzhen[i][j]!=0)
{
len++;
a[k].i=i;
a[k].j=j;
a[k].x=juzhen[i][j];
k++;
}
}
}
}
ju::ju(int o,int p) //初始化
{
m=o;
n=p;
len=0;
int j,i;
cout<<"請(qǐng)輸入矩陣各個(gè)點(diǎn)的數(shù)字:\n";
for(i=1;i<=o;i++)
{
for(j=1;j<=p;j++)
{
cin>>juzhen[i][j];
}
}
}
int ju::get_m()const
{
return m;
}
int ju::get_n()const
{
return n;
}
ju & ju::add(ju c,ju &y)
{
int m1,n1;
m1=c.get_m();
n1=c.get_n();
if(m!=m1||n!=n1){
cout<<"您輸入的矩陣格式不匹配\n";
flag1=0;
return *this;
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
y.juzhen[i][j]=juzhen[i][j]+c.juzhen[i][j];
}
}
return y;
}
ju & ju::minus(ju c,ju &y)
{
int m1,n1;
m1=c.get_m();
n1=c.get_n();
if(m!=m1||n!=n1){
cout<<"您輸入的矩陣格式不匹配\n";
flag2=0;
return *this;
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
y.juzhen[i][j]=juzhen[i][j]-c.juzhen[i][j];
}
}
return y;
}
ju& ju::multi(ju c,ju &y)
{
if(n!=c.m){
cout<<"您輸入的格式存在問題無法進(jìn)行計(jì)算\n";
flag3=0;
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=c.n;j++)
{
for(int k=1;k<=c.m;k++)
y.juzhen[i][j]+=juzhen[i][k]*c.juzhen[k][j];
}
}
return y;
}
void ju::print()const //對(duì)矩陣和三元組進(jìn)行打印
{
cout<<"矩陣結(jié)果如下:\n";
for(int i =1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cout<<juzhen[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
cout<<"上述矩陣的三元組表示如下:\n";
for(int k=1;k<=len;k++)
{
cout<<a[k].i<<" "<<a[k].j<<" "<<a[k].x<<endl;
}
}
void ju::generate()
{
int k,i,j;
juzhen[10][10]={0};
for(k=1;k<=len;k++){
i=a[k].i;
j=a[k].j;
juzhen[i][j]=a[k].x;
}
}
ju ju::Invert(ju y,ju c)
{
int a,b;
int num[20],position[20];
for(a=1;a<=c.len;a++)
{
num[a]=0;
position[a]=0;
}
for(a=1;a<=c.m;a++)
{
for(b=1;b<=c.n;b++)
{
if(juzhen[b][a]!=0)
{
num[b]++;
}
}
}
position[1]=1;
for(a=2;a<=len;a++)
{
position[a]=num[a-1]+position[a-1];
}
for(b=1;b<=c.len;b++)
{
int col=c.a[b].j;
int q=position[col];
y.a[q].i=c.a[b].j;
y.a[q].j=c.a[b].i;
y.a[q].x=c.a[b].x;
y.len++;
y.m=c.n;
y.n=c.m;
++position[col];
}
return y;
}
int main()
{
int m1,n1,x,m2,n2;
char c;
cout<<"請(qǐng)輸入第一個(gè)矩陣的格式:\n";
cin>>m1>>n1;
ju b(m1,n1);
b.get_three();
b.print();
cout<<"請(qǐng)輸入第二個(gè)矩陣的格式:\n";
cin>>m2>>n2;
ju d(m2,n2);
d.get_three();
cout<<"是否要進(jìn)行矩陣的運(yùn)算:\n";
cin>>c;
while(c=='y'||c=='Y')
{
cout<<"運(yùn)算如下:"
<<"1.矩陣加法add."
<<"2.矩陣減法minus."
<<"3.矩陣乘法."
<<"4.矩陣逆置."<<endl;
cout<<endl;
cout<<"請(qǐng)輸入您要選擇的運(yùn)算:";
cin>>x;
if(x==1){
cout<<"請(qǐng)輸入結(jié)果矩陣的各個(gè)元素必須定義為0\n";
ju y(m1,n1);
y=b.add(d,y);
if(flag1==0)
continue;
y.get_three();
cout<<"矩陣加法的結(jié)果為:\n";
y.print();
}
else if(x==2){
cout<<"請(qǐng)輸入結(jié)果矩陣的各個(gè)元素必須定義為0\n";
ju a(m1,n1);
a=b.minus(d,a);
if(flag2==0)
continue;
a.get_three();
cout<<"矩陣減法的結(jié)果為:\n";
a.print();
}
else if(x==3){
cout<<"請(qǐng)輸入結(jié)果矩陣的各個(gè)元素必須定義為0\n";
ju g(m1,n2);
g=b.multi(d,g);
if(flag3==0)
continue;
g.get_three();
cout<<"矩陣乘法的結(jié)果為:\n";
g.print();
}
else if(x==4){
ju h(m1,n1);
h=b.Invert(h,b);
h.generate();
h.print();
}
cout<<"是否要繼續(xù)進(jìn)行矩陣的運(yùn)算:\n";
cin>>c;
}
}
運(yùn)行的內(nèi)容結(jié)果如下:
?
?
?
?
下面是一些測試錯(cuò)誤的案例:?
文章來源:http://www.zghlxwxcb.cn/news/detail-409271.html
?本篇內(nèi)容到此結(jié)束,有需要借走的朋友請(qǐng)留下點(diǎn)痕跡嘿嘿。文章來源地址http://www.zghlxwxcb.cn/news/detail-409271.html
到了這里,關(guān)于C++數(shù)據(jù)結(jié)構(gòu)稀疏矩陣運(yùn)算(含加減乘及快速轉(zhuǎn)置)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!