回 帖 发 新 帖 刷新版面

主题:三元组矩阵转置问题不懂,请教!

例:采用三元组的存储结构,写出对稀疏矩阵进行转置的算法.
算法思路:假如知道矩阵B是矩阵A的转置.显然,一个稀疏矩阵的转置矩阵还是一个稀疏矩阵.假设M和T是table类型的变量,M和T分别表示矩阵A和B.可知,如果只是简单地交换M.data中地i和j的内容,那么得到的T.data将是一个按列优先顺序存储的稀疏矩阵B的三元组表,要得到按行优先顺序存储的T.data,还必须重新排列三元组表T.data的顺序.那么如果由稀疏矩阵A的三元组表M.data得到其转置矩阵B的三元组表T.data呢?由于A的列就是B的行,因此可按下列思想进行处理:对A中的每一列col(0<=col<=n-1)从头到尾扫描三元组表M.data,找出所有列号等于col的三元组,将它们的行号和列号互换后依次放入T.data中,即可得到B的按行优先存储的三元组表T.data.算法如下:
trans1(table *M,table T)
{
int col,b,q=0;
T->rownum=M->colnum;
T->colnum=M->rownum;
T->nznum=M->nznum;
if(T->nznum!=0)
{
 for(col=0;col<M->colnum;col++)
    for(b=0;b<M->nznum;b++)
       if(M->data[b].j==col)
       {
        T->data[q].i=M->data[b].j;
        T->data[q].j=M->data[b].i;
        T->data[q].e=M->data[b].e;
        q++;
        }
}
}


三元组定义如下:
typedef struct
{int i;   //行标
 int j;   //列标
 int e;   //非0元素值
}tupletype;

typedef struct
{
int rownum;   //行数
int colnum;   //列数
int nznum;    //非0元素个数
tupletype data[100];  //非0三元组表
}table;



帮忙解说一下这个算法过程,另外主要的是 for(b=0;b<M->nznum;b++) 一句在这里是什么意思?如果b<M->nznum就是说b小于非0元素个数,那么这将如何循环啊?如果只有一个非零元素,那岂不是就循环一次程序就完了?就是理解不透!!!

回复列表 (共5个回复)

沙发

trans1(table *M,table T)
{
int col,b,q=0;
T->rownum=M->colnum;
T->colnum=M->rownum;
T->nznum=M->nznum;
if(T->nznum!=0)
{
 for(col=0;col<M->colnum;col++)
    for(b=0;b<M->nznum;b++)
       if(M->data[b].j==col)
       {
        T->data[q].i=M->data[b].j;
        T->data[q].j=M->data[b].i;
        T->data[q].e=M->data[b].e;
        q++;
        }
}
}


三元组定义如下:
typedef struct
{int i;   //行标
 int j;   //列标
 int e;   //非0元素值
}tupletype;

typedef struct
{
int rownum;   //行数
int colnum;   //列数
int nznum;    //非0元素个数
tupletype data[100];  //非0三元组表
}table;



帮忙解说一下这个算法过程,另外主要的是 for(b=0;b<M->nznum;b++) 一句在这里是什么意思?如果b<M->nznum就是说b小于非0元素个数,那么这将如何循环啊?如果只有一个非零元素,那岂不是就循环一次程序就完了?就是理解不透!!!
  
M转置到T,优化后,他是先在T中找到恰到的位置然后直接放上去就好了

M->data[b].j可能这里早一存放了要方的位置,然后比较,在T中找到位置,就可以之间交换了,放上去~

板凳

难道就因为数据结构难回答的人就这么少吗?
艾~~~谢谢楼上的,可是我还是不大理解~~~数据结构不学好那就不用学程序了!我自己研究吧~~~如果有高手路过请帮帮忙,谢谢了!!!

3 楼

整个程序基本能看懂,那个循环的判断条件就是那样的.
而那个q++是用来干嘛的?

4 楼


q++是为了调用各个三元组,以检索三元组是否满足条件

5 楼

首先矩阵的存储顺序是依据:
 1.行号(如1~M->rownum)
 2.当行号一致时,按列号排
(如(1,[color=FF0000]1[/color],2)
    (1,[color=FF0000]2[/color],4)
    (2,[color=FF0000]1[/color],5)
    (3,[color=FF0000]1[/color],3)
这个转制函数中 
for(col=0;col<M->colnum;col++)
    for(b=0;b<M->nznum;b++)
的意思是在M中按列号查找非零元(M->data[b]),可以看到第一个找到的列号为1的非零元,它的行号必定是该列中最小的,它转制后当然是行号为1的列号最小的,当然直接赋给T中第一个元素。
总的来说就是按T的顺序在M中找到相应的非零元。

我来回复

您尚未登录,请登录后再回复。点此登录或注册