| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1621 人关注过本帖
标题:[求助]稀疏矩阵转置运算
只看楼主 加入收藏
柒兲
Rank: 1
等 级:新手上路
威 望:1
帖 子:126
专家分:0
注 册:2007-9-26
收藏
 问题点数:0 回复次数:4 
[求助]稀疏矩阵转置运算

#include <stdio.h>
#include <malloc.h>

typedef struct{
int i,j; /*非零元素下标*/
int v; /*非零元素值*/
}tripletp;
typedef struct{
tripletp elem[100]; /*非零元素三元组表*/
int m,n,t; /*矩阵的的行数,列数,和非零元素个数*/
}spmattp;

spmattp *init()
{
spmattp *p;
p=(spmattp *)malloc(sizeof(spmattp));
p->m=0;
p->n=0;
p->t=0;
return p;
}

void transmat(spmattp *a,spmattp *b)
{
int q; /*elem[]中的序号*/
int col; //行
int p;
b->m=a->m;
b->n=a->n;
b->t=a->t;
if(a->t!=0)
{
q=0;
for(col=1;col<=a->n;col++) /*第col列等列标的元素作为结果距阵的第i行的元素*/
for(p=0;p<a->t;p++)
{/*依次在M中寻找等列的元素*/
if(a->elem[p].j==col) /*找到目标元素进行转置运算*/
{
b->elem[q].i=a->elem[p].j;
b->elem[q].j=a->elem[p].i;
b->elem[q].v=a->elem[p].v;
q++;
}
}
}
}

void main()
{
int y;
int x;
spmattp *ma, *mb;
ma=init();
mb=init();
ma->t=6;
ma->n=6;
for(x=0;x<ma->t;x++)
{
printf("请依输入非零元素的下标 i ,j ,v的值\n");
scanf("%d,%d,%d",&ma->elem[x].i,&ma->elem[x].j,&ma->elem[x].v);
// ma->n++;
ma->m++;
}
transmat(ma,mb);
int p=0;
printf("i,j,n \n");
for(y=0;y<ma->m;y++)
{
printf("%d %d %d \n",mb->elem[p].i,mb->elem[p].j,mb->elem[p].v);
p++;
}
}
大家给点意见!

[此贴子已经被作者于2007-10-29 18:32:51编辑过]

搜索更多相关主题的帖子: spmattp 矩阵 三元 int 元素 
2007-10-28 20:09
zxc1998
Rank: 1
等 级:新手上路
威 望:1
帖 子:133
专家分:0
注 册:2007-3-21
收藏
得分:0 
这是关于三元组转置的基本算法,算法是正确的,但测试程序有错误:
ma->t=6;
ma->n=6;
for(x=0;x<ma->t;x++)
{
printf("请依输入非零元素的下标 i ,j ,v的值\n");
scanf("%d,%d,%d",&ma->elem[x].i,&ma->elem[x].j,&ma->elem[x].v);
// ma->n++;
ma->m++;
}
注意红色部分,应改为:
ma->m=6;
ma->n=6;
ma->t=6;
for(x=0;x<ma->t;x++)
{
printf("请依输入非零元素的下标 i ,j ,v的值\n");
scanf("%d,%d,%d",&ma->elem[x].i,&ma->elem[x].j,&ma->elem[x].v);
}
2007-10-29 20:48
柒兲
Rank: 1
等 级:新手上路
威 望:1
帖 子:126
专家分:0
注 册:2007-9-26
收藏
得分:0 

嗯 ` 谢谢了`1

以后会注意的~!


2007-10-29 22:44
柒兲
Rank: 1
等 级:新手上路
威 望:1
帖 子:126
专家分:0
注 册:2007-9-26
收藏
得分:0 
谢谢大家帮忙了!

我改了下``
请大家多提点意见!谢谢``

2007-10-30 12:38
柒兲
Rank: 1
等 级:新手上路
威 望:1
帖 子:126
专家分:0
注 册:2007-9-26
收藏
得分:0 

#include <stdio.h>
#include <malloc.h>

typedef struct{
int i,j; /*非零元素下标*/
int v; /*非零元素值*/
}tripletp;
typedef struct{
tripletp elem[100]; /*非零元素三元组表*/
int m,n,t; /*矩阵的的行数,列数,和非零元素个数*/
}spmattp;

spmattp *init()
{
spmattp *p;
p=(spmattp *)malloc(sizeof(spmattp));
p->m=0;
p->n=0;
p->t=0;
return p;
}

void transmat(spmattp *a,spmattp *b)
{
int q; /*elem[]中的序号*/
int col; //行
int p;
b->m=a->m;
b->n=a->n;
b->t=a->t;
if(a->t!=0)
{
q=0;
for(col=1;col<=a->n;col++) /*第col列等列标的元素作为结果距阵的第i行的元素*/
for(p=0;p<a->t;p++)
{/*依次在M中寻找等列的元素*/
if(a->elem[p].j==col) /*找到目标元素进行转置运算*/
{
b->elem[q].i=a->elem[p].j;
b->elem[q].j=a->elem[p].i;
b->elem[q].v=a->elem[p].v;
q++;
}
}
}
}

void main()
{
int y;
int x;
int p=0;
spmattp *ma, *mb;
ma=init();
mb=init();
ma->t=3;
ma->m=6;
ma->n=6;
for(x=0;x<ma->t;x++)
{
printf("请依输入非零元素的下标 i ,j ,v的值\n");
scanf("%d,%d,%d",&ma->elem[x].i,&ma->elem[x].j,&ma->elem[x].v);
}
printf("转置前的矩阵:\n");
for(x=0;x<ma->n;x++)
{
for(y=0;y<ma->m;y++)
{
if(ma->elem[p].i==y && ma->elem[p].j==x)
{
printf("%d\t",ma->elem[p].v);
p++;
}
else
printf("0\t");
}
printf("\n");
}
transmat(ma,mb);
p=0;
printf("转置后的矩阵:\n");
for(y=0;y<mb->n;y++)
{
for(x=0;x<mb->m;x++)
{
if(mb->elem[p].i==x && mb->elem[p].j==y)
{
printf("%d\t",mb->elem[p].v);
p++;
}
else
printf("0\t");
}
printf("\n");

}
}


2007-10-30 12:39
快速回复:[求助]稀疏矩阵转置运算
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036490 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved