R语言中矩阵运算输出存储至子矩阵的问题及命名需求
解决嵌套循环重复问题并拆分矩阵为子矩阵
首先看你的异常场景代码,问题出在嵌套循环的索引逻辑上:你用k从1到8遍历行,但内层的j和i循环会完整遍历所有NhSh的元素,每一次内层循环结束后,pv[k,]都会被最后一个NhSh[j,i](也就是NhSh[2,4])的计算结果覆盖,所以最终所有行都是同一个值。
修正后的循环代码
我们需要把j(行索引)和i(列索引)映射到唯一的k行号,确保每个NhSh[j,i]都对应pv里的一行:
Nh<-matrix(c(17,26,30,17,23, 17 ,24, 23), nrow=2, ncol=4); Nh Sh<-matrix(c(8.290133, 6.241174, 6.096808, 7.4449672, 6.894924, 7.692115, 4.540521, 7.409122), nrow=2, ncol=4); Sh NhSh<-as.matrix(Nh*Sh); NhSh rh<-c( 0.70710678, 0.40824829, 0.28867513, 0.22360680, 0.18257419, 0.15430335, 0.13363062, 0.11785113, 0.10540926, 0.09534626); rh # 初始化8行10列的矩阵 pv<-matrix(nrow=8, ncol=10) # 修正后的循环逻辑 k <- 1 for(j in 1:2) { # 遍历NhSh的行 for(i in 1:4) { # 遍历NhSh的列 pv[k,] <- NhSh[j,i] * rh k <- k + 1 # 每处理一个元素,行号自增 } } pv
运行这段代码后,pv就会生成你预期的8行结果。
更简洁的向量化实现(推荐)
R语言更擅长向量化操作,完全可以不用循环,直接生成结果,效率更高代码也更简洁:
# 将NhSh转为向量,与rh做外积后转置,直接得到8行10列的目标矩阵 pv <- t(as.vector(NhSh) %o% rh)
这个方法的输出结果和修正后的循环完全一致。
拆分矩阵为两个子矩阵
要把pv的前4行和后4行分别命名为独立子矩阵,直接用索引提取即可:
# 提取前4行作为第一个子矩阵 pv_sub1 <- pv[1:4, ] # 提取后4行作为第二个子矩阵 pv_sub2 <- pv[5:8, ]
之后你就可以直接调用pv_sub1和pv_sub2进行后续计算了。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

