如何在R中正确实现修正格拉姆-施密特算法?代码报错求助
修正格拉姆-施密特算法(MGS)实现中的下标越界错误
你的代码触发下标越界错误,核心是两个逻辑和语法问题:
- 冗余循环导致向量初始化错误:第一个独立的
for(i in 1:ncol(A))循环完全无效,只会让v最终被赋值为A的最后一列,违背了MGS算法中每轮处理第i列时需重新初始化v为A[,i]的逻辑。 - 内层循环范围语法错误:
i + 1:ncol(A)在R中会被解析为i + (1:ncol(A)),比如当i=1、ncol(A)=2时,会生成2,3,而矩阵仅2列,j=3时自然触发下标越界。正确写法应为(i+1):ncol(A),表示从i+1到ncol(A)的整数序列。
此外,原始代码用单个v变量无法保存多列的中间更新值,这也是算法逻辑上的疏漏。以下是完整修正后的代码:
X = matrix(c(1, 2, 0, 3, -1, 4), nrow = 3, ncol = 2, byrow = T) txtMGS <- function(A){ n <- ncol(A) m <- nrow(A) Q <- matrix(0, nrow = m, ncol = n) R <- matrix(0, nrow = n, ncol = n) # 初始化V矩阵保存中间向量,避免覆盖原始矩阵 V <- A for(i in 1:n){ # 计算R的对角元(向量模长) R[i,i] <- sqrt(sum(V[,i]^2)) # 归一化得到Q的第i列 Q[,i] <- V[,i] / R[i,i] # 用Q_i正交化后续所有列,更新V和R的上三角元 for(j in (i+1):n){ R[i,j] <- sum(Q[,i] * V[,j]) V[,j] <- V[,j] - R[i,j] * Q[,i] } } return(list(Q = Q, R = R)) } # 测试验证 result <- txtMGS(X) print("正交矩阵Q:") print(result$Q) print("上三角矩阵R:") print(result$R) print("验证Q^T Q是否为单位矩阵:") print(t(result$Q) %*% result$Q) print("验证Q%*%R是否等于原始矩阵X:") print(result$Q %*% result$R)
运行修正后的代码即可得到正确的QR分解结果,同时验证了算法的正确性。
内容的提问来源于stack exchange,提问作者DuckTooth
相关产品推荐
相关产品推荐

