一、三对角矩阵行映射描述
1、代码
#include<bits/stdc++.h>
using namespace std;
template<class T>
class TridiagonalMatrix{
public:
TridiagonalMatrix(int size) {n=size; t=new T[3*n-2];}
~TridiagonalMatrix() {delete []t;}
int getsize(){return n;}
TridiagonalMatrix<T>& Store(const T&x, int i, int j);
//三对角矩阵乘三对角矩阵所得矩阵不是三对角矩阵,因此不定义乘法,只定义加法和转置
TridiagonalMatrix<T>& add( TridiagonalMatrix&x);
TridiagonalMatrix<T>& transform();
T Retrieve(int i, int j) const;
private:
int n; //矩阵维数
T *t; //存储三对角矩阵的一维数组
};
template<class T>
TridiagonalMatrix<T>& TridiagonalMatrix<T>::Store(const T& x, int i, int j)
{ //把x存为T(i,j)
if(i<1||j<1||i>n||j>n) throw OutOfBounds();
else if(i-j>=-1 && i-j<=1){t[2*i+j-3] = x;}
}
template<class T>
T TridiagonalMatrix<T>::Retrieve(int i, int j) const
{//返回T(i,j)
if(i<1||j<1||i>n||j>n) throw OutOfBounds();
else if(i-j>=-1 && i-j<=1){return t[2*i+j-3];}
else{return 0;}
}
template<class T>
TridiagonalMatrix<T>& TridiagonalMatrix<T>::add( TridiagonalMatrix&x)
{
if(x.getsize()!=this->getsize());
else{
int n=getsize();
for(int i=0;i<n*(n+1)/2;i++){
t[i] += x.t[i];
}
}
}
template<class T>
TridiagonalMatrix<T>& TridiagonalMatrix<T>::transform()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
{
if(i-j>=-1 && i-j<=1){
T temp = this->t[2*i+j-3];
t[2*i+j-3] = t[2*j+i-3];
t[2*j+i-3] = temp;
}
}
}
2、测试(需要去掉异常处理,因为不包含该类,把T*t暂时改成public测试)
int main(){
TridiagonalMatrix<int> t(3);
t.Store(9, 1, 1);
t.Store(8, 1, 2);
t.Store(7, 2, 1);
t.Store(6, 2, 3);
t.Store(5, 3, 2);
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
cout<<t.Retrieve(i,j)<<" ";
}
cout<<endl;
}
cout<<endl;
t.transform();
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
cout<<t.Retrieve(i,j)<<" ";
}
cout<<endl;
}
cout<<endl;
TridiagonalMatrix<int> tt(3);
tt.Store(5, 1, 1);
tt.Store(6, 1, 2);
tt.Store(7, 2, 1);
tt.Store(8, 2, 2);
tt.Store(9, 3, 2);
t.add(tt);
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
cout<<t.Retrieve(i,j)<<" ";
}
cout<<endl;
}
cout<<endl;
}
二、定义对称矩阵的类和方法
1、代码
#include<bits/stdc++.h>
using namespace std;
template<class T>
class SymmetricMatrix{//按下三角存储
public:
SymmetricMatrix(int size) {n=size; t=new T[n*(n+1)/2];}
int getsize(){return n;}
~SymmetricMatrix() {delete []t;}
SymmetricMatrix<T>& Store(const T&x, int i, int j);
//由于n阶对称矩阵乘n阶对称矩阵得到的不一定是n阶对称矩阵,因此不再定义乘法
SymmetricMatrix<T>& add(SymmetricMatrix<T> x);
//对称矩阵的转置仍为其本身,不再定义
T Retrieve(int i, int j) const;
//private:
int n; //矩阵维数
T *t; //存储对称矩阵的一维数组
};
template<class T>
SymmetricMatrix<T>& SymmetricMatrix<T>::Store(const T& x, int i, int j)
{ //把x存为T(i,j),按行映射存储
if(i<1||j<1||i>n||j>n) throw OutOfBounds();
else if(i>=j){t[i*(i-1)/2+j-1] = x;}
else{t[j*(j-1)/2+i-1] = x;}
}
template<class T>
T SymmetricMatrix<T>::Retrieve(int i, int j) const
{//返回T(i,j)
if(i<1||j<1||i>n||j>n) throw OutOfBounds();
else if(i>=j){return t[i*(i-1)/2+j-1];}
else{return t[j*(j-1)/2+i-1];}
}
template<class T>
SymmetricMatrix<T>& SymmetricMatrix<T>::add(SymmetricMatrix<T> x)
{
if(x.getsize()!=this->getsize());
else{
int n=getsize();
for(int i=0;i<n*(n+1)/2;i++){
t[i] += x.t[i];
}
}
}
2、测试(需要去掉异常处理,因为不包含该类,把T*t暂时改成public测试)
int main(){
SymmetricMatrix<int> s(4);
s.Store(12, 2, 4);
s.Store(1, 4, 4);
s.Store(-4, 1, 2);
s.Store(-1, 3, 3);
s.Store(6, 1, 1);
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
cout<<s.Retrieve(i,j)<<" ";
}
cout<<endl;
}
cout<<endl;
SymmetricMatrix<int> ss(4);
ss.Store(11, 2, 3);
ss.Store(2, 4,2);
ss.Store(4, 1, 2);
ss.Store(12, 4, 3);
ss.Store(3, 1, 1);
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
cout<<ss.Retrieve(i,j)<<" ";
}
cout<<endl;
}
cout<<endl;
s.add(ss);
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
cout<<s.Retrieve(i,j)<<" ";
}
cout<<endl;
}
}