Сложная матричная манипуляция - PullRequest
1 голос
/ 12 апреля 2019

Мои данные выглядят так, X и Y - центр дефекта. Я хочу назначить дефект в матрице.

defect_ID X Y X_range Y_range
1         2 3  5        0
2         7 12 1        2

Я создал матрицу 200 * 200 только с 0. Я хочу поставить 1 в матрице следующим образом:

Каждая координата X Y будет равна 1. Например, мы можем увидеть ID 1 , что позволит 1 моей ячейке координаты (2,3). ID 2 позволит 1 в мою камеру (7,12).

Я сделал это с кодом

img<-matrix(0,200,200)
img[cbind(data[,X],data[,Y])]<-1

Теперь я хочу сделать что-нибудь хитрое. Я беру дефектный_идентификатор и хочу присвоить значение 1 всем точкам вокруг этого дефекта, используя мои значения X_range и Y_range. Для 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, я хочу присвоить 1 точке (2,3), (3,3), (4,3), (5,3), (6,3), (7,3)

В случае, если у меня X_range и Y_range> 1. X Y будет центром. Тогда я хочу двигаться только в одном направлении. Например, для идентификатора 2 я хочу присвоить 1 своим ячейкам (7,12), (8,12), (7,13), (7,14)

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Вот один из вариантов:

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
0 голосов
/ 12 апреля 2019
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
}

Это должно работать как минимум для первой части. Я не слишком ясно, на втором. Что если диапазон нечетный? какое направление выбрать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...