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
上个效果图:卧槽,我的浏览器抽风了,点插入图片没反应,自己运行吧