【问题标题】:Complex matrix manipulation复杂的矩阵操作
【发布时间】:2019-04-12 08:32:06
【问题描述】:

我的数据看起来像这样,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 这将允许 1 到我的坐标单元格 (2,3)。 ID 2 将允许 1 进入我的单元格 (7,12)。

我已经用代码做到了这一点

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

现在我想做一些棘手的事情。 我取一个defect_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,我想将 1 分配给点 (2,3),(3,3),(4,3),(5,3),(6,3), (7,3)

如果我有 X_range 和 Y_range>1。 X Y 将是中心。然后我想当时只朝一个方向移动。 例如,对于 ID 2,我想将 1 分配给我的单元格 (7,12),(8,12),(7,13),(7,14)

【问题讨论】:

  • 你说“移动”是什么意思?!
  • 我的意思是使用 X_range 和 Y_range 值修改相邻单元格;对于缺陷 1,中心为 (2,3),X_range=c(1,2,3,4,5)。所以我想找到单元格 (2+1,3),(2+2,3)... 并将它们赋值为 1。可能是“移动”不是合适的词。

标签: r image matrix


【解决方案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
}

这至少应该适用于第一部分。第二个我不是很清楚。如果范围是奇数怎么办?我应该选择哪个方向?

【讨论】:

    【解决方案2】:

    这是一种选择:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多