c++ 实现稀疏矩阵创建(从文件方式)

2024年11月22日 08:41
有1个网友回答
网友(1):

C++稀疏矩阵转置代码:

#include     
002    using namespace std;    
003    //三元组    
004    struct Trituple    
005    {    
006        int row, col;  //非零元素的行号、列号    
007        int val;       //非零元素的值    
008    };    
009    //稀疏矩阵类声明    
010    class SparseMatrix    
011    {    
012    //friend ostream & operator << (ostream &, SparseMatrix &);    
013                            //友元函数,输出流操作符重载    
014    //friend istream & operator >> (istream &, SparseMatrix &);    
015                            //友元函数,输入流操作符重载    
016    public:    
017        SparseMatrix(int maxt = 100); //构造函数    
018        ~SparseMatrix(); //析构函数    
019        bool TransposeTo(SparseMatrix &); //转置    
020        bool TransposeTo_Faster(SparseMatrix &);//快速转置    
021        void AddTo(const SparseMatrix &);//加运算    
022        bool Input(); //输入稀疏矩阵    
023        void Output();//输出稀疏矩阵    
024    private:    
025        Trituple *data; //存储非零元素三元组的数组    
026        int rows, cols, terms;    //矩阵的行数、列数、非零元素个数    
027        int maxterms; //数组data的大小    
028    };    
029    //构造函数,分配maxt个三元组结点的顺序空间,构造一个空的稀疏矩阵三元组表。    
030    SparseMatrix::SparseMatrix(int maxt)    
031    {    
032        maxterms = maxt;    
033        data = new Trituple [maxterms];    
034        terms = rows = cols = 0;    
035    }//SparseMatrix    
036    //析构函数,将三元组表结构销毁。    
037    SparseMatrix::~SparseMatrix()    
038    {    
039        if (data != NULL) delete [] data;    
040    }//~SparseMatrix    
041    /*//输出稀疏矩阵    
042    ostream & operator << (ostream & out, SparseMatrix & M)    
043    {    
044        out << "rows=" << M.rows << endl;    
045        out << "cols=" << M.cols << endl;    
046        out << "terms=" << M.terms << endl;    
047        for (int i = 0; i < M.terms; i++)    
048            out << "data[" << M.data[i].row << "," << M.data[i].col << "]=" << M.data[i].val << endl;    
049        return out;    
050    };    
051    //输入稀疏矩阵    
052    istream & operator >> (istream & in, SparseMatrix & M)    
053    {    
054        cout << "输入稀疏矩阵的行数、列数以及非零元素个数" << endl;    
055        in >> M.rows >> M.cols >> M.terms;    
056        if (M.terms > M.maxterms) exit (1);    
057        cout << "terms=" << M.terms << endl;    
058        for (int i = 0; i < M.terms; i++){    
059            cout << "输入非零元素的行号、列号和元素值 " << i + 1 << endl;    
060            in >> M.data[i].row >> M.data[i].col >> M.data[i].val;    
061        }    
062        return in;    
063    };*/    
064    //转置,将*this的转置矩阵送入B    
065    bool SparseMatrix::TransposeTo(SparseMatrix &B)    
066    {    
067        if(terms > B.maxterms)    
068            return false;    
069        B.rows = cols;    
070        B.cols = rows;    
071        B.terms = terms;    
072        if (terms > 0) {    
073            int p = 0;    
074            for (int j = 1; j <= cols; j++)    
075                for (int k = 0; k < terms; k++)    
076                    if (data[k].col == j) {    
077                        B.data[p].row = j;    
078                        B.data[p].col = data[k].row;    
079                        B.data[p].val = data[k].val;    
080                        p++;    
081                    }    
082        }    
083        return true;    
084    }//TransposeTo    
085    //快速转置,将*this的转置矩阵送入B    
086    bool SparseMatrix::TransposeTo_Faster(SparseMatrix &B)    
087    {    
088        if (terms > B.maxterms)    
089            return false;    
090        B.rows = cols;    
091        B.cols = rows;    
092        B.terms = terms;    
093        if (terms > 0) {    
094            int *num, *cpot;    
095            int j,k,p;    
096            num = new int[cols];    
097            cpot = new int[cols];    
098            for (j = 0; j < cols; j++)  //初始化num[]    
099                num[j] = 0;    
100            for (k = 0; k < terms; k++)  //统计每一列的非零元素个数num[]    
101                num[data[k].col - 1]++;    
102            //求出B中每一行的起始下标cpot[]    
103            cpot[0] = 0;    
104            for(j = 1; j < cols; j++)    
105                cpot[j] = cpot[j - 1] + num[j - 1];    
106            //执行转置操作    
107            for(k = 0; k < terms; k++) {    
108                p = cpot[data[k].col - 1]++;   //B中的位置    
109                B.data[p].row = data[k].col;    
110                B.data[p].col = data[k].row;    
111                B.data[p].val = data[k].val;    
112            }    
113            delete [] num;    
114            delete [] cpot;    
115        }    
116        return true;    
117    }//TransposeTo_Faster    
118    //输入稀疏矩阵    
119    bool SparseMatrix::Input()    
120    {    
121        cout << "输入稀疏矩阵的行数、列数以及非零元素个数" << endl;    
122        cin >> rows >> cols >> terms;    
123        if (terms > maxterms) {    
124            cout << "非零元个数太多!" << endl;    
125            return false;    
126        }    
127        if (terms == 0)    
128            return true;    
129        cout << "按行序输入" << terms << "个非零元素的三元组" << endl;    
130        for (int i = 0; i < terms; i++) {    
131            cout << "输入第" << i + 1 << "个非零元素的行号、列号和元素值 " << endl;    
132            cin >> data[i].row >> data[i].col >> data[i].val;    
133            if (data[i].row < 1 || data[i].row > rows || data[i].col < 1 || data[i].col > cols) {    
134                cout << "矩阵输入有误!" << endl;    
135                return false;    
136            }    
137        }    
138        return true;    
139    }//Input    
140    //输出稀疏矩阵    
141    void SparseMatrix::Output()    
142    {    
143        cout << "rows=" << rows << endl;    
144        cout << "cols=" << cols << endl;    
145        cout << "terms=" << terms << endl;    
146        for (int i = 0; i < terms; i++)    
147            cout << "data[" << data[i].row << "," << data[i].col << "]=" << data[i].val << endl;    
148    }//Output    
149    int main()    
150    {    
151        SparseMatrix M(100);    
152        if (M.Input()) {    
153            cout << "原始矩阵:" << endl;    
154            M.Output();    
155            SparseMatrix T, S;    
156            cout << "转置矩阵:" << endl;    
157            if(M.TransposeTo(T))    
158                T.Output();    
159            if(M.TransposeTo_Faster(S))    
160                S.Output();    
161            system("pause");    
162            return 1;    
163        }    
164        else    
165            return 0;    
166    }