如何在R中高效创建指定结构的1452×44非对称0-1矩阵?
高效创建符合要求的R矩阵
首先,注意到你的矩阵尺寸1452×44正好是33×44的倍数(33×44=1452),这为我们高效生成矩阵提供了便利。我会分两种情况来解决,因为你的描述里第33列的要求和前面列的递进逻辑略有矛盾,我都会覆盖到:
情况1:符合递进逻辑的完整44列矩阵(推测你可能笔误,第33列应为第44列)
按照你描述的第1列、第2列的规律,每一列的33个0元素依次后移33行,直到第44列时0元素在最后33行,这是最符合逻辑的场景。我们可以利用向量重复和矩阵索引来实现,完全避免循环,效率很高:
# 生成行组索引:把1452行分成44个组,每组33行 row_groups <- rep(1:44, each = 33) # 创建全1矩阵 mat <- matrix(1, nrow = 1452, ncol = 44) # 当行组号等于列号时,设为0(即每列对应组的位置为0) mat[outer(row_groups, 1:44, "==")] <- 0
验证一下:
- 第1列:
mat[1:33, 1]全为0,剩余为1,符合要求 - 第2列:
mat[34:66, 2]全为0,剩余为1,符合要求 - 第44列:
mat[1420:1452, 44]全为0,剩余为1,和你描述的“第33列”的要求一致
情况2:严格按照你的描述(前33列的0元素从第1组跳到第44组)
如果你确实需要第1到32列的0元素依次后移33行,第33列的0元素直接跳到最后33行,剩余11列(34-44)设为全1,我们可以用循环快速实现(仅33次循环,完全不影响效率):
# 创建全1矩阵 mat <- matrix(1, nrow = 1452, ncol = 44) # 处理前32列:0元素依次后移33行 for(k in 1:32){ start_row <- (k-1)*33 + 1 end_row <- k*33 mat[start_row:end_row, k] <- 0 } # 处理第33列:最后33行设为0 mat[1420:1452, 33] <- 0
这样生成的矩阵完全匹配你描述的每一列要求,第34到44列保持全1,如果你需要这些列有其他规则,可以自行修改。
两种方法都很高效,第一种利用向量运算更简洁,第二种严格贴合你的描述,你可以根据实际需求选择。
内容的提问来源于stack exchange,提问作者nymuffin
相关产品推荐
相关产品推荐

