| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1029 人关注过本帖
标题:稀疏矩阵 每行第一个非零元的位置计算问题
只看楼主 加入收藏
Uni丶say
Rank: 1
等 级:新手上路
帖 子:5
专家分:6
注 册:2011-10-21
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:1 
稀疏矩阵 每行第一个非零元的位置计算问题
程序代码:
 Status CreateSMatrix(RLSMatrix *M)

 { /* 创建稀疏矩阵M */
   int i;
   Triple T;
   Status k;
   printf("请输入矩阵的行数,列数,非零元素数:");
   scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);
   (*M).data[0].i=0; /* 为以下比较做准备 */
   for(i=1;i<=(*M).tu;i++)
   {
     do
     {
       printf("请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:",i,(*M).mu,(*M).nu);
       scanf("%d,%d,%d",&T.i,&T.j,&T.e);
       k=0;
       if(T.i<1||T.i>(*M).mu||T.j<1||T.j>(*M).nu) /* 行、列超出范围 */
         k=1;
       if(T.i<(*M).data[i-1].i||T.i==(*M).data[i-1].i&&T.j<=(*M).data[i-1].j) /* 没有按顺序输入非零元素 */
         k=1;
     }while(k); /* 当输入有误,重新输入 */
     (*M).data[i]=T;
   }
   for(i=1;i<=(*M).tu;i++) /* 计算rpos[] */
     if((*M).data[i].i>(*M).data[i-1].i)
       for(T.i=0;T.i<(*M).data[i].i-(*M).data[i-1].i;T.i++)
         (*M).rpos[(*M).data[i].i-T.i]=i;
   for(i=(*M).data[(*M).tu].i+1;i<=(*M).mu;i++) /* 给最后没有非零元素的几行赋值 */
     (*M).rpos[i]=(*M).tu+1;
   return OK;

 }
rpos数组存放每行第一个非零元的位置

计算rpos[]这个过程看不懂

还想问一下 最后给没有非零元的行赋值  可不可以都设置成0?
搜索更多相关主题的帖子: 矩阵 color 
2011-12-30 04:42
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
收藏
得分:20 
程序代码:
/*
看不懂说明,可以试运行改程序!
*/

#include <stdio.h>

#define MAXSIZE 100
#define MAXRC 20
#define OK 1

typedef int ElemType;
typedef int Status;

typedef struct
{
    int i, j;
    ElemType e;
}Triple;
typedef struct
{
    Triple data[MAXSIZE+1];
    int rpos[MAXRC+1];
    int mu, nu, tu;
}RLSMatrix;

Status CreateSMatrix(RLSMatrix *M)
{ /* 创建稀疏矩阵M */
   int i;
   Triple T;
   Status k;
   printf("请输入矩阵的行数,列数,非零元素数:");
   scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);
   (*M).data[0].i=0; /* 为以下比较做准备 */
   for(i=1;i<=(*M).tu;i++)
   {
     do
     {
       printf("请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:",i,(*M).mu,(*M).nu);
       scanf("%d,%d,%d",&T.i,&T.j,&T.e);
       k=0;
       if(T.i<1||T.i>(*M).mu||T.j<1||T.j>(*M).nu) /* 行、列超出范围 */
         k=1;
       if(T.i<(*M).data[i-1].i||T.i==(*M).data[i-1].i&&T.j<=(*M).data[i-1].j) /* 没有按顺序输入非零元素 */
         k=1;
     }while(k); /* 当输入有误,重新输入 */
     (*M).data[i]=T;
   }
   for(i=1;i<=(*M).tu;i++) /* 计算rpos[] */
     if((*M).data[i].i>(*M).data[i-1].i) //比较非零数组中该非零元所在行与前一非零元所在行的大小
       for(T.i=0;T.i<(*M).data[i].i-(*M).data[i-1].i;T.i++)  //如果大于,则检查非零数组中相邻非零元所差的行数,并求出对应行首个非零元地址存入rpos[]中
       {
           (*M).rpos[(*M).data[i].i-T.i]=i;                    //比如:相邻非零数组中第三个元素data[3]与第四个元素data[4]的行(假设data[4].i=5,data[3].i=3)相差2
            printf("rpos[%d]=%d  ", (*M).data[i].i-T.i, i);    //则,rpos[4]=rpos[5]=4(即四、五行首个非零元在data[]数组中的位置为下标4)
       }
       for(i=(*M).data[(*M).tu].i+1;i<=(*M).mu;i++)      //最后一个非零元所在行下一行首非零元为data中最后一个非零元下一个地址,这对后面界定所在行非零元范围有用                
     (*M).rpos[i]=(*M).tu+1;                          //比如:存在非零元的最后一行界定范围从rpos[M.data[M.tu]]到M.tu+1即(rpos[M.data[M.tu]+1])
   return OK;                                         //设置成零的话,因为rpos[0]中是一个垃圾值可能会影响计算。
}

int main(void)
{
    RLSMatrix M;
    printf("请输入提供例子:本矩阵5行3列4个非零元(5,3,4),\n第一行一个非零元(1,1,1),\n第二行一个(2,2,2),\n第三行一个(3,3,3),\n第四行没有,第五行一个(5,2,4)\n");
    CreateSMatrix(&M);
    return 0;
}

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2011-12-30 18:52
快速回复:稀疏矩阵 每行第一个非零元的位置计算问题
数据加载中...
 
   



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

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