稀疏矩阵转置:
普通转置:逐列遍历M
void TransposeSMatrix(Matrix M, Matrix& T) {
T.m = M.n; T.n = M.m; T.t = M.t;
if (T.t) {
int q = 1;
for (int col = 1; col <= M.n; col++)
for(int p=1;p<=M.t;p++)
if (M.data[p].j == col) //遍历M每一列
T.data[q++] = {
M.data[p].j, M.data[p].i, M.data[p].e };
}
}
快速转置:num记录M每列非零元个数,cpot记录每列第一个元素在T.data中的位置
void FastTransposeSMatrix(Matrix M, Matrix &T) {
T.m = M.n; T.n = M.m; T.t = M.t;
int t, col, p, q;
if (T.t) {
for (t = 1; t <= M.t; t++)//num记录M每列非零元个数
num[M.data[t].j]++;
for (col = 2; col <= M.n; col++)//cpot记录每列第一个元素在T.data中的位置
cpot[col] = cpot[col - 1] + num[col - 1];
for (p = 1; p <= M.t; p++) {
col = M.data[p].j; q = cpot[col];
T.data[q] = {
M.data[p].j, M.data[p].i, M.data[p].e };
cpot[col]++;//cpot[col]为col列下一个元素的位置
}
}
}
稀疏矩阵相乘: 辅设cpot数组。缺点:cpot数组大小有限,会爆
void get_cpot(Matrix &M, Matrix &N) {
//得到M,N的cpot
int t, col;
for (t = 1; t <= M.t; t++)num[M.data[t].i]++;
for (col = 1; col <= M.m; col++)M.cpot[col] = M.cpot[col - 1] + num[col - 1];
memset(num, 0, sizeof(num));
for (t = 1; t <= N.t; t++)num[N.data[t].i]++;
for (col = 1; col <= N.m; col++)N.cpot[col] = N.cpot[col - 1] + num[col - 1];
}
void MultSMatrix(Matrix M, Matrix N, Matrix& Q) {
if (M.n != N.m) return;
Q.m = M.m; Q.n = N.n; Q.t = 0;
get_cpot(M, N);
int tp, br