主题:三元组矩阵转置问题不懂,请教!
例:采用三元组的存储结构,写出对稀疏矩阵进行转置的算法.
算法思路:假如知道矩阵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元素个数,那么这将如何循环啊?如果只有一个非零元素,那岂不是就循环一次程序就完了?就是理解不透!!!
算法思路:假如知道矩阵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元素个数,那么这将如何循环啊?如果只有一个非零元素,那岂不是就循环一次程序就完了?就是理解不透!!!