?? rlsmatrix.h
字號:
void AddSMatrix(RLSMatrix a,RLSMatrix b,RLSMatrix &c)
{
//求兩個用三元組順序表表示的二維矩陣a與b的和,并用新的矩陣c返回
int i,j,s;
int t,tp,arow,ccol;
int ctemp[21];
if((a.mu!=b.mu) || (b.nu!=a.nu)) //判斷是否可以進行加法運算
{
printf("add error\n");
exit(0);
}
c.mu=a.mu;c.nu=a.nu;c.tu=0;
if(a.tu+b.tu==0)
return;
for(arow=1;arow<=a.mu;arow++)
{
for(i=1;i<=a.nu;i++)
ctemp[i]=0;
c.rpos[arow]=c.tu+1;
if(arow<a.mu)
{
tp=a.rpos[arow+1];
t =b.rpos[arow+1];
}
else
{
tp=a.tu+1;
t =b.tu+1;
}
j=a.rpos[arow];s=b.rpos[arow];
//在一行中進行同時遍歷,當a中的一個元素的列數更小時賦給ctemp數組,更大則b的賦給數組,否則運算后賦給數組
while(j<tp && s<t)
{
if(a.data[j].col<b.data[s].col)
{
ccol =a.data[j].col;
ctemp[ccol]=a.data[j].number;
j++;
}
else if(a.data[j].col>b.data[s].col)
{
ccol =b.data[s].col;
ctemp[ccol]=b.data[s].number;
s++;
}
else
{
ccol =a.data[j].col;
ctemp[ccol]=a.data[j].number+b.data[s].number;
++j;s++;
}
}
while(j<tp)
{
ccol =a.data[j].col;
ctemp[ccol]=a.data[j].number;
j++;
}
while(s<t)
{
ccol =b.data[s].col;
ctemp[ccol]=b.data[s].number;
s++;
}
for(ccol=1;ccol<=c.nu;ccol++)
if(ctemp[ccol])
{
if(++c.tu>MAXSIZE)
{
printf("add bounds error\n");
exit(0);
}
c.data[c.tu].row =arow;
c.data[c.tu].col =ccol;
c.data[c.tu].number=ctemp[ccol];
}
}
}
void SubSMatrix(RLSMatrix a,RLSMatrix b,RLSMatrix &c)
{
//求兩個用三元組順序表表示的二維矩陣a與b的差,并用新的矩陣c返回
int i,j,s;
int t,tp,arow,ccol;
int ctemp[21];
if((a.mu!=b.mu) || (b.nu!=a.nu))
{
printf("sub error\n");
exit(0);
}
c.mu=a.mu;c.nu=a.nu;c.tu=0;
if(a.tu+b.tu==0)
return;
for(arow=1;arow<=a.mu;arow++)
{
for(i=1;i<=a.nu;i++)
ctemp[i]=0;
c.rpos[arow]=c.tu+1;
if(arow<a.mu)
{
tp=a.rpos[arow+1];
t =b.rpos[arow+1];
}
else
{
tp=a.tu+1;
t =b.tu+1;
}
j=a.rpos[arow],s=b.rpos[arow];
while(j<tp && s<t)
{
if(a.data[j].col<b.data[s].col)
{
ccol =a.data[j].col;
ctemp[ccol]=a.data[j].number;
j++;
}
else if(a.data[j].col>b.data[s].col)
{
ccol =b.data[s].col;
ctemp[ccol]=0-b.data[s].number;
s++;
}
else
{
ccol =a.data[j].col;
ctemp[ccol]=a.data[j].number-b.data[s].number;
j++;s++;
}
}
while(j<tp)
{
ccol =a.data[j].col;
ctemp[ccol]=a.data[j].number;
j++;
}
while(s<t)
{
ccol =b.data[s].col;
ctemp[ccol]=0-b.data[s].number;
s++;
}
for(ccol=1;ccol<=c.nu;ccol++)
if(ctemp[ccol])
{
if(++c.tu>MAXSIZE)
{
printf("sub bounds error\n");
exit(0);
}
c.data[c.tu].row =arow;
c.data[c.tu].col =ccol;
c.data[c.tu].number=ctemp[ccol];
}
}
}
void MulSMatrix(RLSMatrix a,RLSMatrix b,RLSMatrix &c)
{
//求兩個用三元組順序表表示的二維矩陣a與b的乘積,并用新的矩陣c返回
int i,j,t,tp;
int ccol,arow,brow;
int ctemp[21];
if(a.nu!=b.mu)
{
printf("mul error\n");
exit(0);
}
c.mu=a.mu;c.nu=b.nu;c.tu=0;
if(a.tu*b.tu==0)
return;
for(arow=1;arow<=a.mu;arow++)
{
for(i=1;i<=b.nu;i++)
ctemp[i]=0;
c.rpos[arow]=c.tu+1;
if(arow<a.mu)
tp=a.rpos[arow+1];
else
tp=a.tu+1;
for(i=a.rpos[arow];i<tp;i++)
{
brow=a.data[i].col;
if(brow<b.mu)
t=b.rpos[brow+1];
else
t=b.tu+1;
for(j=b.rpos[brow];j<t;j++)
{
ccol=b.data[j].col;
ctemp[ccol]+=a.data[i].number*b.data[j].number;
}
}
for(ccol=1;ccol<=c.nu;ccol++)
if(ctemp[ccol])
{
if(++c.tu>MAXSIZE)
{
printf("bounds error\n");
exit(0);
}
c.data[c.tu].row =arow;
c.data[c.tu].col =ccol;
c.data[c.tu].number=ctemp[ccol];
}
}
}
void TransposeSMatrix(RLSMatrix a,RLSMatrix &t)
{
//求矩陣a的轉置矩陣,并用新的矩陣t返回
int i,j,acol;
int num[21],cpot[21];
t.mu=a.nu; t.nu=a.mu; t.tu=a.tu;
if((a.mu==0) || (a.nu==0))
return;
if(t.tu==0)
return;
for(acol=1;acol<=a.nu;acol++)
num[acol]=0;
for(i=1;i<=a.tu;i++)
++num[a.data[i].col];
cpot[1]=1;
for(acol=2;acol<=a.nu;acol++)
cpot[acol]=cpot[acol-1]+num[acol-1];
for(i=1;i<=a.tu;i++)
{
acol=a.data[i].col;
j =cpot[acol];
t.data[j].row =a.data[i].col;
t.data[j].col =a.data[i].row;
t.data[j].number=a.data[i].number;
cpot[acol]++;
}
}
RLSMatrix RemainderSMatrix(RLSMatrix a,int delrow,int delcol)
{
//求除去第delrow行和第delcol列的所有元素后的剩余矩陣,用矩陣b返回
int i,tp,arow;
RLSMatrix b;
if(a.mu!=a.nu)
{
printf("輸入矩陣應為n階方陣\n");
exit(0);
}
if((delrow>a.mu) || (delcol>a.nu)) //當要刪除的行數或列數不合法時的處理
{
printf("remainder error\n");
exit(0);
}
if(a.mu==0)
{
printf("矩陣為空\n");
exit(0);
}
b.mu=a.mu-1;b.nu=a.nu-1;b.tu=0;
//先處理一行,根據該行中元素的列數和要刪除列數比較來進行不同的處理
for(arow=1;arow<=a.mu;arow++)
{
if(arow<a.mu)
tp=a.rpos[arow+1];
else
tp=a.tu+1;
if(arow==delrow)continue; //列數與目標列數相等則不做處理
if(arow<delrow)
{
b.rpos[arow]=b.tu+1; //列數比目標列數更小,則直接復制,否則行數或列數需減一
}
else
{
b.rpos[arow-1]=b.tu+1;
}
for(i=a.rpos[arow];i<tp;i++)
{
if(a.data[i].col==delcol)continue;
if(arow<delrow)
{
b.data[b.tu+1].row =arow;
}
else
{
b.data[b.tu+1].row =arow-1;
}
if(a.data[i].col<delcol)
{
b.data[b.tu+1].col=a.data[i].col;
}
else
{
b.data[b.tu+1].col=a.data[i].col-1;
}
b.data[b.tu+1].number=a.data[i].number;
b.tu++;
}
}
return b;
}
int ValueSMatrix(RLSMatrix a)
{
//求矩陣a的行列式的值,并用value返回
int value,i,arow,tp,m;
value=0;
arow=1;
if(a.mu!=a.nu)
{
printf("請輸入方陣\n");
exit(0);
}
if(a.tu==0)
return 0;
if(a.mu==1)
return a.data[1].number;
if(arow<a.mu)
tp=a.rpos[arow+1];
else
tp=a.tu+1;
//直接按第一行展開來算行列式
for(i=a.rpos[arow];i<tp;i++)
{
m=(a.data[i].row+a.data[i].col)%2;
if(m==1) //該元素的行數和列數之和為奇數
{
value+=a.data[i].number*(-1)*ValueSMatrix(RemainderSMatrix(a,arow,a.data[i].col));
}
else //該元素的行數和列數之和為偶數
value+=a.data[i].number*ValueSMatrix(RemainderSMatrix(a,arow,a.data[i].col));
}
return value;
}
void GoWithSMatrix(RLSMatrix a,RLSMatrix &b)
{
//求矩陣a的伴隨矩陣,并用矩陣b返回
int ctemp[21][21];
int arow,acol,m;
for(arow=1;arow<=a.mu;arow++)
{
for(acol=1;acol<=a.nu;acol++)
{
m=(arow+acol)%2;
if(m==0) //該元素的行數和列數之和為偶數
{
ctemp[acol][arow]=ValueSMatrix(RemainderSMatrix(a,arow,acol));
}
else //該元素的行數和列數之和為奇數
ctemp[acol][arow]=(-1)*ValueSMatrix(RemainderSMatrix(a,arow,acol));
}
}
b.mu=a.mu;b.nu=a.nu;b.tu=0;
//將ctemp中保存的伴隨矩陣中的元素壓入稀疏矩陣進行存儲
for(arow=1;arow<=a.mu;arow++)
{
b.rpos[arow]=b.tu+1;
for(acol=1;acol<=a.nu;acol++)
if(ctemp[arow][acol])
{
if(++b.tu>MAXSIZE)
{
printf("create bounds error\n");
exit(0);
}
b.data[b.tu].row =arow;
b.data[b.tu].col =acol;
b.data[b.tu].number=ctemp[arow][acol];
}
}
}
void AthwartSMatrix(RLSMatrix a,RLSMatrix &b)
{
//求矩陣a的逆矩陣,并用新的矩陣b返回
int value,i;
value=ValueSMatrix(a);
if(value==0)
{
printf("該矩陣無逆矩陣\n");
exit(0);
}
GoWithSMatrix(a,b); //用b返回a的伴隨矩陣
for(i=1;i<=b.tu;i++)
{
b.data[i].number=b.data[i].number/value; //將伴隨矩陣的每個元素再除以行列式的值即可
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -