有关R语言矩阵问题,急求

我现在有个初始全为0的矩阵M,
然后我给其中几个元素赋值20,现在我想再给M中那些值为20的元素的周围8个相邻单位中不为0的元素赋值,请问R中有什么函数可以简洁地实现这个吗,难道只能是用循环判断吗?

R语言的矩阵默认可以看成按列组成的向量,函数which可以判定那个位置上元素为不是零,根据位置判断其前后,以及前一列,后一列位置上的元素是不是为0,如当前是i,则前一个后一个分别为i-1,i+1,而前一列对应位置则为i-num.of.row-1,i-num.of.row,i-num.of.row+1,后一列i+num.of.row-1,i+num.of.row,i+num.of.row+1。特殊情况就是判断边界的时候进行出来,看我的例子:

m <- matrix(0,10,10)
m[4,4] <-20
m[4,5] <-20 
m[3,9] <-20 
m[7,9] <-20 
m
nr <- nrow(m)
nc <- ncol(m)
for(i in which(m!=0)){
 #如果是第一列,不处理前列列
 if(i<nr){
  # 前一个 i-1,后一个i+1
  # 下一列 i+nr-1,i+nr,i+nr+1
  if(i%%nr==1){#如果是第一行
   chs <- c(i+1,i+nr,i+nr+1)
   for(j in chs){
    if(m[j]==0){
     m[j] <-1000
    }
   }
  }
  else if(i%%nr==0){#如果是最后一行
   chs <- c(i-1,i+nr-1,i+nr)
   for(j in chs){
    if(m[j]==0){
     m[j] <-1000
    }
   }
  }else{
   chs <- c(i-1,i+1,i+nr-1,i+nr,i+nr+1)
   for(j in chs){
    if(m[j]==0){
     m[j] <-1000
    }
   }
  }

 }
 #如果是最后一列,不处理后一列
 else if(i>nr*(nc-1)){
     if(i%%nr==1){#如果是第一行
   chs <- c(i-nr,i-nr+1,i+1)
   for(j in chs){
    if(m[j]==0){
     m[j] <-1000
    }
   }
  }
  else if(i%%nr==0){#如果是最后一行
   chs <- c(i-1,i-nr-1,i-nr)
   for(j in chs){
    if(m[j]==0){
     m[j] <-1000
    }
   }
  }else{
   chs <- c(i-1,i+1,i-nr-1,i-nr,i-nr+1)
   for(j in chs){
    if(m[j]==0){
     m[j] <-1000
    }
   }
  }
 
 }
 #不是第一列也不是最后一列
 else{
  if(i%%nr==1){#如果是第一行
   chs <- c(i-nr,i-nr+1,i+1,i+nr,i+nr+1)
   for(j in chs){
    if(m[j]==0){
     m[j] <-1000
    }
   }
  }
  else if(i%%nr==0){#如果是最后一行
   chs <- c(i-nr-1,i-nr,i-1,i+nr-1,i+nr)
   for(j in chs){
    if(m[j]==0){
     m[j] <-1000
    }
   }
  }else{
   chs <- c(i-nr-1,i-nr,i-nr+1,i-1,i+1,i+nr-1,i+nr,i+nr+1)
   for(j in chs){
    if(m[j]==0){
     m[j] <-1000
    }
   }
  } 
 } 
}
m

上个效果图:卧槽,我的浏览器抽风了,点插入图片没反应,自己运行吧

温馨提示:答案为网友推荐,仅供参考
相似回答