在R语言中修改矩阵的L型区域是否有更简便的方法?
方阵L型区域元素批量运算的简化实现
问题背景
现有10×10方阵abmat,需对第7-10行(g-j行)和第7-10列(g-j列)覆盖的所有元素执行乘10操作(即包含右下角4×4区域、前6行的后4列、后4行的前6列的L型区域)。尝试通过排除法仅能选中右下角区域,拆分行列赋值的方式可行但步骤繁琐,希望找到更直接的实现方法。
初始矩阵构造
abmat <- matrix( data = rpois(n = 10*10, lambda = 1), nrow = 10, dimnames = list(letters[1:10], letters[1:10]) )
输出结果:
a b c d e f g h i j a 0 2 2 1 0 0 0 1 1 2 b 2 1 2 2 0 1 0 0 1 1 c 1 0 1 2 0 2 2 1 1 0 d 0 2 0 0 1 3 1 1 3 1 e 0 0 1 1 3 2 1 1 1 0 f 1 1 1 1 2 0 2 1 0 1 g 0 0 2 1 0 0 0 0 1 3 h 0 2 2 0 1 0 2 1 1 1 i 1 1 0 2 0 0 2 1 0 1 j 0 0 2 0 0 0 1 1 2 1
尝试的无效方法(排除法)
仅能选中右下角4×4区域,无法覆盖完整L型:
abmat[-1:-6, -1:-6]*10
输出结果:
g h i j g 0 0 10 30 h 20 10 10 10 i 20 10 0 10 j 10 10 20 10
可行但繁琐的拆分实现
分两次赋值,先处理后4行所有列,再处理前6行的后4列:
abmat2 <- abmat abmat2[7:10,] <- abmat[7:10,]*10 abmat2[1:6, 7:10] <- abmat[1:6, 7:10]*10
输出结果:
a b c d e f g h i j a 0 2 2 1 0 0 0 10 10 20 b 2 1 2 2 0 1 0 0 10 10 c 1 0 1 2 0 2 20 10 10 0 d 0 2 0 0 1 3 10 10 30 10 e 0 0 1 1 3 2 10 10 10 0 f 1 1 1 1 2 0 20 10 0 10 g 0 0 20 10 0 0 0 0 10 30 h 0 20 20 0 10 0 20 10 10 10 i 10 10 0 20 0 0 20 10 0 10 j 0 0 20 0 0 0 10 10 20 10
更直接的简化实现
利用逻辑索引一次性选中所有目标元素,无需拆分操作:
abmat3 <- abmat # 生成逻辑索引:行属于7-10 或 列属于7-10 idx <- (row(abmat3) %in% 7:10) | (col(abmat3) %in% 7:10) # 对选中元素执行乘10操作 abmat3[idx] <- abmat3[idx] * 10
运行后abmat3的结果与上述abmat2完全一致,仅需两行核心代码即可完成需求。
内容的提问来源于stack exchange,提问作者Scransom
相关产品推荐
相关产品推荐

