froster

博客园 首页 新随笔 联系 订阅 管理
#include"SMatrix.h"
#include
"convert.h"
#include
<iostream>
#include
<fstream>
#include
<string>
#include
<vector>
#include
<typeinfo>
using namespace std;
template 
<class Type>
void Convert(const string &s, Type a[])
{
    
string separate = ",| ";
    vector
<Type> vec;
    
int pos = 0;
    
int pos2 = 0;
    
while(string::npos != pos)
    {
        pos 
= s.find_first_of(separate, pos2);
        
if(pos == s.find_last_of(separate))
        {
            
if(strcmp(typeid(Type).name(), "int"== 0)
            {
                vec.push_back(atoi(s.substr(pos2, pos 
- pos2).c_str()));
                vec.push_back(atoi(s.substr(pos 
+ 1).c_str()));
            }
            
break;
        }

        
if(0 < pos - pos2)
        {
            
if(strcmp(typeid(Type).name(), "int"== 0)
                vec.push_back(atoi(s.substr(pos2, pos 
- pos2).c_str()));
        }

        pos2 
= pos + 1;
    }

    
for(int i = 0; i < vec.size(); i++)
        a[i] 
= vec[i];
    
}

void CreateSMatrix(TSMatrix &m)
{
    ifstream f(
"smatrix.txt");
    
char *buf = new char[100];
    
string s;
    f.getline(buf,
100);
    s 
= buf;
    
int a[3];
    Convert(s, a);
    m.mu 
= a[0];
    m.nu 
= a[1];
    m.tu 
= a[2];
    
int i = 1;
    
while(f.getline(buf,100))
    {
        s 
= buf;
        Convert(s, a);
        m.data[i].i 
= a[0];
        m.data[i].j 
= a[1];
        m.data[i].e 
= a[2];
        i
++;
    }

    f.close();
    delete[] buf;
}

void PrintSMatrix(TSMatrix &m)
{
    
int i, j;
    
int pos = 1;
    
int currentPos;
    
for(i = 1; i <= m.tu; i++)
    {
        currentPos 
= (m.data[i].i - 1* m.nu + m.data[i].j;
        
for(j = pos; j < currentPos; j++)
        {
            cout
<<setw(5)<<0;
            
if(j % m.nu== 0)
                cout
<<endl;
        }
        cout
<<setw(5)<<m.data[i].e;
        
if(currentPos % m.nu == 0)
            cout
<<endl;
        pos 
= currentPos + 1;
    }

    
for(j = pos; j <= m.mu * m.nu; j++)
    {
        cout
<<setw(5)<<0;
        
if(j % m.nu== 0)
            cout
<<endl;
    }
}

int FastTransposeSMatrix(TSMatrix M, TSMatrix &T)
{
    T.mu 
= M.nu;
    T.nu 
= M.mu;
    T.tu 
= M.tu;

    
if(T.tu == 0)
        
return 0;

    
int col;
    
int t;
    
int *num = new int[M.nu + 1];
    
int *cpot = new int[M.nu + 1];

    
for(col = 1; col <= M.nu; col++)
        num[col] 
= 0;

    
for(t = 1; t <= M.tu; t++)
        num[M.data[t].j]
++;

    cpot[
1= 1;
    
for(col = 2; col <= M.nu; col++)
        cpot[col] 
= cpot[col -1 ] + num[col -1];

    
int p, q;
    
for(p = 1; p <= M.tu; p++)
    {
        col 
= M.data[p].j;
        q 
= cpot[col];
        T.data[q].i 
= M.data[p].j;
        T.data[q].j 
= M.data[p].i;
        T.data[q].e 
= M.data[p].e;
        cpot[col]
++;
    }

    delete[] num;
    delete[] cpot;
    
return 1;
}
int TransposeSMatrix(TSMatrix M, TSMatrix &T)
{
    T.mu 
= M.nu;
    T.nu 
= M.mu;
    T.tu 
= M.tu;

    
if(T.tu == 0)
        
return 0;

    
int q = 1;
    
int col;
    
int p;
    
for(col = 1; col <= M.nu; col++)
    {
        
for(p = 1; p <= M.tu; p++)
        {
            
if(M.data[p].j == col)
            {
                T.data[q].i 
= M.data[p].j;
                T.data[q].j 
= M.data[p].i;
                T.data[q].e 
= M.data[p].e;
                q
++;
            }
        }
    }
    
return 1;
}

void main()
{
    TSMatrix m, t;
    CreateSMatrix(m);
    PrintSMatrix(m);
    printf(
"\n");
    FastTransposeSMatrix(m, t);
    PrintSMatrix(t);

}

 

程序从文本文件中读取三元组数据.例如文本文件smatrix.txt中的内容是:

6,7,8
1,2,12
1,3,9
3,1,-3
3,6,14
4,3,24
5,2,18
6,1,15
6,4,-7

posted on 2009-06-12 11:06  大牛  阅读(486)  评论(0编辑  收藏  举报