您的位置:首页 > 其它

矩阵快速转置

2017-11-21 21:23 253 查看
#include<stdlib.h>
#include<stdio.h>
typedef struct {
int r;
int c;
int d=0;
}TupNode;//定义每个非零元素对应的三元数组
typedef struct {
int rows;
int cols;
int nums;//非零元素个数
TupNode data[500];
}TSMatrix;//三元组顺序表,用顺序表(每个元素是三元组)来存储稀疏矩阵
//创建
/*void CreatMat(TSMatrix &t, int A[M]
)
{
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 min = 10000;
int num[500];
int cpot[500] ;
//十字链表表示稀疏矩阵

int main()
{
int i = 0, j, k, m, n;
TSMatrix ta, tb, t;
scanf("%d %d %d", &ta.rows, &ta.cols, &ta.nums);
int min = 10000;

for (i = 0; i < ta.nums; i++)
{
scanf("%d %d %d", &ta.data[i].r, &ta.data[i].c, &ta.data[i].d);
num[ta.data[i].c]++;
if (ta.data[i].c < min)
{
min = ta.data[i].c;
}
}
cpot[1] = 1;
for (i =2; i <=ta.cols; i++)
{
cpot[i] = cpot[i - 1] + num[i - 1];
}
tb.rows = ta.cols;
tb.cols = ta.rows;
tb.nums = ta.nums;
for (i = 0; i < ta.nums; i++)
{
int cc = ta.data[i].c;
int q = cpot[cc];
while (tb.data[q].d != 0)
{
q++;
}
tb.data[q].c = ta.data[i].r;
tb.data[q].r = ta.data[i].c;
tb.data[q].d = ta.data[i].d;
}
printf("num:");
for (i = 1; i <=ta.cols; i++)
{
printf("%d,", num[i]);
}
printf("\n");
printf("cpot:");
for (i = 1; i <= ta.cols; i++)
{
printf("%d,",cpot[i]);
}
printf("\n");
for (i =1; i <=tb.nums; i++)
{
printf("%d,%d,%d\n", tb.data[i].r, tb.data[i].c, tb.data[i].d);
}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: