用C ++转置稀疏矩阵

时间:2013-03-08 14:13:31

标签: c++ sparse-matrix

我是C ++的新手。在这里,我试图找出稀疏矩阵的转置。这是代码:

#include<iostream>
using namespace std;
class transposeM{
    int m1[20][20],m2[20][20],i,j,row,column,t;
public:
    void read(){
        t=0;
        cout<<"Enter the number of row: \n";
        cin>>row;
        cout<<"enter the number of column: \n";
        cin>>column;

        for(i=0;i<row;i++){
            for(j=0;j<column;j++){
                cin>>m1[i][j];

                if(m1[i][j]){
                    t++;
//                  cout<<"first t is:"<<t;
                //if non zero
                            m2[t][0]=i+1;
                            m2[t][1]=j+1;
                            m2[t][2]=m1[i][j];

                }


            }
        }

        m2[0][0]=row;
        m2[0][1]=column;
        m2[0][2]=t;
    }

    void displaysp(){
cout<<"sparse matrix is: \n";
        for(i=0;i<=t;i++){
            for(j=0;j<3;j++){
                cout<<m2[i][j]<<" ";
            }
            cout<<"\n";
        }
    }

    void transpose(){
        int transpose[20][3];

                        transpose[0][0]=m2[0][0];
                        transpose[0][1]=m2[0][1];
                        transpose[0][2]=m2[0][2];
        cout<<"Transpose is: \n";
        int q=1;
        for(i=1;i<=column;i++){
            for(int p=1;p<=t;p++){
                if(m2[p][1]==i){
                    transpose[q][0]=m2[p][0];
                    transpose[q][1]=m2[p][1];
                    transpose[q][2]=m2[p][2];
                    q++;

                }
            }
        }

        for(i=0;i<=column;i++){
            for(j=0;j<3;j++){
                cout<<transpose[i][j]<<" ";
            }
            cout<<"\n";
        }

    }
    void display(){
        for(i=0;i<row;i++){
                for(j=0;j<column;j++){
                    cout<<m1[i][j]<<" ";


                }
                cout<<"\n";
            }

    }
};
int main(int argc,char ** argv){
    transposeM obj;
    obj.read();
    obj.display();
    obj.displaysp();
    obj.transpose();
    return 0;
}

输出:

Enter the number of row: 
2
enter the number of column: 
2
0
1
2
0
0 1 
2 0 
sparse matrix is: 
2 2 2 
1 2 1 
2 1 2 
Transpose is: 
2 2 2 
2 1 2 
1 2 1 

但出了点问题;读取矩阵并将其转换为稀疏矩阵就可以了。但是找出转置会产生一些逻辑错误。

3 个答案:

答案 0 :(得分:2)

转置的简单代码段为:(transpose将是m2的转置)

for(i=0;i<column;i++) {
    for(j=0;j<row;j++) {
       transpose[i][j] = m2[j][i];
    }
}

你有不必要的复杂事情。

答案 1 :(得分:2)

可以为您节省一些麻烦并帮助简化问题的一点是,当您转置矩阵时,您只需切换案例rowcolumn中的ij索引即可{1}}。因此,您可以编写一个display()方法,只需设置转置标志或参数,例如:

void displaysp()
{
    // m is the number of rows in matrix
    // n is the number of columns in matrix
    unsigned int tmpM=m, tmpN=n ; 

    if( transposeFlag )
    {
       tmpM = n ;
       tmpN = m ;
    }         

    for(unsigned i=0;i<tmpM;i++)
     {
        for(unsigned j=0;j<tmpN;j++)
        {
            if( transposeFlag )
            {
                cout<<m2[j][i]<<" ";
            }
            else
            {
               cout<<m2[i][j]<<" ";
            }
        }
        cout<<"\n";
    }
}

答案 2 :(得分:0)

问题已修复,我发布了代码:

#include<iostream>
using namespace std;
class transposeM{
    int m1[20][20],m2[20][20],i,j,row,column,t;
public:
    void read(){
        t=0;
        cout<<"Enter the number of row: \n";
        cin>>row;
        cout<<"enter the number of column: \n";
        cin>>column;

        for(i=0;i<row;i++){
            for(j=0;j<column;j++){
                cin>>m1[i][j];

                if(m1[i][j]){
                    t++;
                            m2[t][0]=i+1;
                            m2[t][1]=j+1;
                            m2[t][2]=m1[i][j];

                }


            }
        }

        m2[0][0]=row;
        m2[0][1]=column;
        m2[0][2]=t;
    }

    void displaysp(){
cout<<"sparse matrix is: \n";
        for(i=0;i<=t;i++){
            for(j=0;j<3;j++){
                cout<<m2[i][j]<<" ";
            }
            cout<<"\n";
        }
    }

    void transpose(){
        int transpose[20][3];

                        transpose[0][0]=m2[0][1];
                        transpose[0][1]=m2[0][0];
                        transpose[0][2]=m2[0][2];
        cout<<"Transpose is: \n";
        int q=1;
        for(i=1;i<=column;i++){
            for(int p=1;p<=t;p++){
                if(m2[p][2]==i){
                    transpose[q][0]=m2[p][1];
                    transpose[q][1]=m2[p][0];
                    transpose[q][2]=m2[p][2];
                    q++;

                }
            }
        }

        for(i=0;i<=column;i++){
            for(j=0;j<3;j++){
                cout<<transpose[i][j]<<" ";
            }
            cout<<"\n";
        }

    }
    void display(){
        for(i=0;i<row;i++){
                for(j=0;j<column;j++){
                    cout<<m1[i][j]<<" ";


                }
                cout<<"\n";
            }

    }
};
int main(int argc,char ** argv){
    transposeM obj;
    obj.read();
    obj.display();
    obj.displaysp();
    obj.transpose();
    return 0;
}

输出:

Enter the number of row: 
2
enter the number of column: 
3
0
1
2
0
0
2
0 1 2 
0 0 2 
sparse matrix is: 
2 3 3 
1 2 1 
1 3 2 
2 3 2 
Transpose is: 
3 2 3 
2 1 1 
3 1 2 
3 2 2