写了一个有限域上矩阵求秩的函数,旁观者清.能否帮我看看是不是有问题(逻辑上的)?

写了一个有限域上矩阵求秩的函数,旁观者清.能否帮我看看是不是有问题(逻辑上的)?
使用的是高斯消去的行初等变换,
能够提出优化同样欢迎.将采纳第一位提出Bug 的大侠.
/* 求秩 */
// GMatrix mat 是有限域上的矩阵
int Rank_(GMatrix mat){
int i,j,k;
int jtimes;
// 跳出,当循环到矩阵行末或列末
// mat.rr 为行数,mat.cc 为列数
for(i = 0,j = 0; (i < mat.rr)&&(j < mat.cc); ++i,++j){ // i:row,j:col
if(mat.Get(i,j)==0){ // leading entry = 0
for(k = i+1; k < mat.rr; ++k){ // 在同列下面的找头一个项不是零的
if(mat.Get(k,j)!=0){ // 第k 行找到了,则将第k 行加到第 i 行
mat.Row_plus_row(i,k);
break;
}
}
if(k >= mat.rr){ //如果这列所有的元素都是零,则移动到下一列
--i;
continue;
}
}
for(k = i+1; k < mat.rr; ++k){ //用第i 行将余下所有行第j 列元素都消去
if(mat.Get(k,j) == 0) continue; //如果该行第j 列元素为零则不用消去
//galois_single_divide()是在伽罗瓦域上mat.Get(i,j)除以mat.Get(k,j),mat.ww 是域大小
jtimes = galois_single_divide(mat.Get(k,j),mat.Get(i,j),mat.ww);
//Row_plus_irow 将第i 行元素乘以jtimes 加到第k 行上
mat.Row_plus_irow(k,i,jtimes);
}
}
//当到达行末或者列末,则行初等变换结束
return i; //返回初等变换的最后一行即秩大小
}
oktrinket 1年前 已收到1个回答 举报

萨哈 春芽

共回答了18个问题采纳率:100% 举报

ug1:
//galois_single_divide()是在伽罗瓦域上mat.Get(i,j)除以mat.Get(k,j),mat.ww 是域大小
jtimes = galois_single_divide(mat.Get(k,j), mat.Get(i,j), mat.ww);
这里是谁除以谁?为什么我觉得弄反了?
bug2:
//Row_plus_irow 将第i 行元素乘以jtimes 加到第k 行上
mat.Row_plus_irow(k, i, jtimes);
应该是第k行减去第i行乘以jtimes,不是加上吧?

1年前

1
可能相似的问题
Copyright © 2024 YULUCN.COM - 雨露学习互助 - 16 q. 0.040 s. - webmaster@yulucn.com