我的数据看起来像这样,X和Y是缺陷的中心。我要在矩阵中分配缺陷。
defect_ID X Y X_range Y_range
1 2 3 5 0
2 7 12 1 2
我创建了一个只有0的矩阵200 * 200。我想通过以下方式将1放入矩阵:
每个坐标X Y将为1。例如,我们可以看到 ID 1 ,该ID将1分配给我的坐标(2,3)单元格。 ID 2 将允许1进入我的单元格(7,12)。
我已经用代码完成了
img<-matrix(0,200,200)
img[cbind(data[,X],data[,Y])]<-1
现在我想做一些棘手的事情。 我使用了一个definition_ID,并希望使用我的X_range和Y_range值将值1分配给该缺陷周围的所有点。对于1个缺陷,我们取中心(X,Y)并使用X和Y_range进行移动。
伪代码
for defect_ID 1
img[X,Y]<-1
img[X+ 1:X_range,Y]<-1
img[X,Y+1:Y_range]<-1
例如,如果我们查看ID 1,我想为点(2,3),(3,3),(4,3),(5,3),(6,3)分配1, (7,3)
如果我有X_range和Y_range> 1。 X Y将成为中心。然后我只想一次朝一个方向移动。 例如,对于ID 2,我想为我的单元格(7,12),(8,12),(7,13),(7,14)分配1
答案 0 :(得分:0)
img = matrix(0,20,15)
for (i in 1:nrow(data)){
sx = data$X[i]:(data$X[i]+data$Y_range[i])
sy = data$Y[i]:(data$Y[i]+data$X_range[i])
img[sx,sy] = 1
}
这至少应该在第一部分起作用。我对第二个不太清楚。如果范围是奇数怎么办?我应该选择哪个方向?
答案 1 :(得分:0)
这里是一种选择:
data <- tibble(defect_ID=c(1,2),X=c(2,7),Y=c(3,12),X_range=c(5,1),Y_range=c(0,2))
输入数据:
> data
# A tibble: 2 x 5
defect_ID X Y X_range Y_range
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 2 3 5 0
2 2 7 12 1 2
创建矩阵:
data_mat <- matrix(0,200,200)
分配:
for (i in 1:2) { # Change this to the length of your dataset
data_mat[data[[i,'X']]:data[[i,'X']]+data[[i,'X_range']],data[[i,'Y']]] <- 1
data_mat[data[[i,'X']],data[[i,'Y']]:data[[i,'Y']]+data[[i,'Y_range']]] <- 1
}
输出:
> data_mat[1:10,1:14]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
[1,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 1 0 0 0 0 0 0 0 0 0 0 0
[3,] 0 0 1 0 0 0 0 0 0 0 0 0 0 0
[4,] 0 0 1 0 0 0 0 0 0 0 0 0 0 0
[5,] 0 0 1 0 0 0 0 0 0 0 0 0 0 0
[6,] 0 0 1 0 0 0 0 0 0 0 0 0 0 0
[7,] 0 0 1 0 0 0 0 0 0 0 0 1 1 1
[8,] 0 0 0 0 0 0 0 0 0 0 0 1 0 0
[9,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[10,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0