R语言高斯消元代码中循环变量k初始值为0而非1的问题排查
问题分析与解决
这是个非常典型的R语言运算符优先级陷阱!
你遇到的k第一个值为0的问题,根源在于R中:(序列运算符)的优先级高于算术运算符-。
看你的循环行:
for (k in 1:n-1){
R会先计算1:n(当n=3时,得到1,2,3),然后再对每个元素减1,最终得到的序列是0,1,2,所以k的第一个取值就是0,这显然不符合高斯消元的逻辑要求。
修正方法
只需要给n-1加上括号,改变运算优先级,让R先计算n-1,再生成从1到这个值的序列:
for (k in 1:(n-1)){
另外,你的内层循环也存在同样的优先级问题,必须一起修正:
for (i in k+1:n)会被错误解析为k + (1:n),完全不是你想要的“从k+1到n的行序列”,要改成(k+1):nfor (j in k+1:n-1)同理,若你的目标是遍历k之后的所有列(包括增广矩阵的常数项列),建议改成(k+1):ncol(mat),更贴合增广矩阵的高斯消元逻辑
修正后的核心循环部分示例:
for (k in 1:(n-1)){ print(k) for (i in (k+1):n){ mat[i,k] <- mat[i,k] / mat[k,k] for (j in (k+1):ncol(mat)){ mat[i,j] <- mat[i,j] - mat[i,k] * mat[k,j] } print(mat) } }
这样运行时,k就会从1开始正常取值,符合高斯消元的步骤要求了。
内容的提问来源于stack exchange,提问作者Jacques Brancher
相关产品推荐
相关产品推荐

