#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