#include<stdio.h>
#include<iostream>
#include<malloc.h>
#include<stdlib.h>
typedef struct {
int r;
int c;
int d;
}TupNode;//定义每个非零元素对应的三元数组
typedef struct {
int rows;
int cols;
int nums;//非零元素个数
TupNode data[500];
}TSMatrix;//三元组顺序表,用顺序表(每个元素是三元组)来存储稀疏矩阵
//创建
/*void CreatMat(TSMatrix &t, int A[M][N])
{
int i, j;
t.rows = M;
t.cols = N;
t.nums = 0;
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
{
if (A[i][j] != 0)
{
t.data[t.nums++] = { i,j,A[i][j] };
//t.data[t.nums].r=i;
//t.data[t.nums].c=j;
//t.data[t.nums].d=A[i][j];
//t.nums++;
}
}
}
}*/
//赋值
bool Value(TSMatrix &t, int x, int i, int j)
{
if (i < 0 || i >= t.rows || j < 0 || j >= t.cols)
{
return false;
}
else
{
int m, q,k;
/*for (m = 0; m < t.nums; m++)
{
//修改已有值
if (t.data[m].r ==i&&t.data[m].c == j)
{
t.data[m].d = x;
return true;
}
else if (t.data[m].r > i&&t.data[m].c > j)
{
for (k = t.nums; k >= (m + 1); k--)
{
t.data[k] = t.data[k - 1];
}
t.data[m] = { i,j,x };
t.nums++;
)
}
/*t.data[t.nums++] = { i,j,x };
return true;*/
k = 0;
while (k<t.nums&&i>t.data[k].r)
k++;
while (k<t.nums&&i ==t.data[k].r&&j>t.data[k].c)k++;
if (t.data[k].r == i&&t.data[k].c == j)
{
t.data[k].d = x;
}
else
{
}
}
}
//将指定位置元素赋值给一个变量
bool Assign(TSMatrix t, int &X, int i, int j)
{
if (i >= t.rows || j >= t.cols)
return false;//超界了
int k=0;
/*for (k = 0; k < t.nums; k++)
{
//能找到说明是非零
if (t.data[k].r == i&&t.data[k].c == j)
{
X = t.data[k].d;
return true;
}
while()
}*/
//查找行
while (k < t.nums&&i>t.data[k].r)
k++;//一定是>=i,没有的话就是最近的大的
while (k<t.nums&&i == t.data[k].r&& j>t.data[k].c)
k++;
if (t.data[k].r == i&&t.data[k].c ==j)
{
X = t.data[k].d;
}
else
{
X = 0;
}
return true;
}
//输出
//转置
//粗糙的算法O(nt)
void Tran(TSMatrix t, TSMatrix &tb)
{
int q = 0, v;
tb.rows = t.cols;
tb.cols = t.rows;
tb.nums = t.nums;
int k = 0;
int p = 0;
if (t.nums != 0)
{
for (p = 0; p < t.cols; p++)
{
for (q = 0; q < t.nums; q++)
{
if (t.data[q].c == p)
{
tb.data[k].r = t.data[q].c;
tb.data[k].c = t.data[q].r;
tb.data[k].d = t.data[q].d;
k++;
}
}
}
}
}
int A[500][500];
//十字链表表示稀疏矩阵
void cheng(TSMatrix ta, TSMatrix tb, TSMatrix &t)
{
t.rows = ta.rows;
t.cols = tb.cols;
t.nums = 0;
int i, j, m,n, num;
m = 0;
n = 0;
for (m=0;m<ta.nums;m++)
{
for (n = 0; n < tb.nums; n++)
{
if(ta.data[m].c== tb.data[n].r)
A[ta.data[m].r][tb.data[n].c] += ta.data[m].d*tb.data[n].d;
}
}
for (i =1; i <=ta.rows; i++)
{
for (j = 1; j <=tb.cols; j++)
{
if (A[i][j] != 0)
{
t.data[t.nums].r=i;
t.data[t.nums].c=j;
t.data[t.nums].d=A[i][j];
t.nums++;
}
}
}
}
int main()
{
int i=0, j, k, m, n;
TSMatrix ta, tb, t;
scanf("%d", &ta.rows);
scanf("%d", &ta.cols);
scanf("%d", &ta.nums);
for (i = 0; i < ta.nums; i++)
{
scanf("%d %d %d", &ta.data[i].r, &ta.data[i].c, &ta.data[i].d);
}
scanf("%d", &tb.rows);
scanf("%d", &tb.cols);
scanf("%d", &tb.nums);
for (i = 0; i < tb.nums; i++)
{
scanf("%d %d %d", &tb.data[i].r, &tb.data[i].c, &tb.data[i].d);
}
cheng(ta, tb, t);
printf("%d\n%d\n%d\n", t.rows, t.cols, t.nums);
for (i = 0; i < t.nums; i++)
{
printf("%d,%d,%d\n", t.data[i].r, t.data[i].c, t.data[i].d);
}
return 0;
}
稀疏矩阵乘法
最新推荐文章于 2022-11-17 21:51:17 发布