[英]Complex matrix manipulation
我的數據看起來像這樣,X和Y是缺陷的中心。 我想在矩陣中分配缺陷。
defect_ID X Y X_range Y_range
1 2 3 5 0
2 7 12 1 2
我創建了一個僅帶0的矩陣200 * 200。 我想通過以下方式將1放入矩陣:
每個坐標XY將為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),(7, 3)
如果我有X_range和Y_range> 1。 XY將為中心。 然后我只想一次朝一個方向移動。 例如對於ID 2我想為我的單元格(7,12),(8,12),(7,13),(7,14)分配1
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
}
這至少應該在第一部分起作用。 我對第二個不太清楚。 如果范圍是奇數怎么辦? 我應該選擇哪個方向?
這是一個選擇:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.