疎マトリクス順序格納の演算方法
ここでは、疎行列が三元グループの順序で格納される演算方法について説明する.
まず、三元グループのデータ構造タイプです.
まず乗算の思想を述べて、2行列は乗算することができる前提はa[n][m]*b[j][k]です
m=j;
a.tu*b.tu!=0;
=>if(a.nu== b.mu && a.tu*b.tu!=0){...}
そして、a行列のi行目とb行列のj列目を新しい行列のi,メタとして乗算する.
疎行列の回転
疎行列の加算
まず、三元グループのデータ構造タイプです.
const int maxn= 100;
typedef struct{
int i,j;// ,
int e;//
}Triple;
typedef struct{
Triple date[maxn +1];//
int mu;//
int nu;//
int tu;//
}RLSMatrix;
まず乗算の思想を述べて、2行列は乗算することができる前提はa[n][m]*b[j][k]です
m=j;
a.tu*b.tu!=0;
=>if(a.nu== b.mu && a.tu*b.tu!=0){...}
そして、a行列のi行目とb行列のj列目を新しい行列のi,メタとして乗算する.
//nump[i] p i prpos[i] p i
//numq[i] q i qrpos[i] q i
RLSMatrix Multiplication(RLSMatrix &p,RLSMatrix &q){
if(p.nu==q.mu && 0!=p.tu*q.tu){
RLSMatrix v;
v.mu=p.mu;
v.nu=q.nu;
v.tu=1;
//
int nump[maxn+1];
int numq[maxn+1];
int pqtemp[maxn+1];
int prpos[maxn+1];
int qrpos[maxn+1];
memset(nump,0,sizeof(nump));
memset(numq,0,sizeof(numq));
for(int g=1;g<=p.tu;g++)//p ;
nump[p.date[g].i]+=1;
for(int f=1;f<=q.tu;f++)//q ;
numq[q.date[f].i]+=1;
for(int k=0;k<=q.tu+1;k++)//q 0
qrpos[k]=0;
for(int h=0;h<=p.tu+1;h++)//p 0
prpos[h]=0;
prpos[1]=1;
qrpos[1]=1;
for(int l=2;l<=q.mu+1;l++)//p
prpos[l]=prpos[l-1]+nump[l-1];
for(int t=2;t<=q.mu+1;t++)//q
qrpos[t]=qrpos[t-1]+numq[t-1];
for(int arow=1;arow<=p.mu;arow++){
int a=prpos[arow];
int b=prpos[arow+1];
memset(pqtemp,0,sizeof(pqtemp));
//a i b i , b pqtemp
for(int tt=a;tt
疎行列の回転
//cpot[i] i
//num[i] i
RLSMatrix TransposeSmatrix(RLSMatrix &M){
//
if(M.tu){
RLSMatrix p;
// ,
p.tu=M.tu;
p.nu=M.mu;
p.mu=M.nu;
// ,num[i] i
//cpot[i] i
int num[maxn+1];
int cpot[maxn+1];
memset(num,0,sizeof(num));
memset(cpot,0,sizeof(cpot));
//num[i] cpot[i]
for(int i=1;i<=M.tu;i++)
num[M.date[i].j]++;
cpot[1]=1;
for(int i=2;i<=M.nu;i++)
cpot[i]=cpot[i-1]+num[i-1];
// ,
for(int k=1;k<=M.tu;k++){
int f=M.date[k].j;
int t=cpot[f];
p.date[t].i=M.date[k].j;
p.date[t].j=M.date[k].i;
p.date[t].e=M.date[k].e;
cpot[f]++;
}//for
return p;
}//if
}
疎行列の加算
RLSMatrix Add(RLSMatrix &p, RLSMatrix &q){
if(p.nu==q.nu && p.mu==q.mu){
RLSMatrix v;
int f=1,t=1,temp=1;
v.nu=p.nu;
v.mu=p.mu;
v.tu=0;
while(f<=p.tu && t<=q.tu){
if(p.date[f].i==q.date[t].i && p.date[f].j==q.date[f].j){
if(0!=(p.date[f].e+q.date[f].e)){
v.date[temp].i=p.date[f].i;
v.date[temp].j=p.date[f].j;
v.date[temp].e=p.date[f].e+q.date[f].e;
temp++;v.tu++;
//cout<q.date[t].i) || (p.date[f].i==q.date[t].i && p.date[f].j>q.date[t].j) ){
v.date[temp].i=q.date[t].i;
v.date[temp].j=q.date[t].j;
v.date[temp].e=q.date[t].e;
temp++;
t++;v.tu++;//cout<