【问题标题】:splitting list elements expanding the list拆分列表元素扩展列表
【发布时间】:2023-03-10 22:11:02
【问题描述】:

我正在做某种光学字符识别并面临以下问题。我将字形存储在二进制矩阵列表中,它们可以具有不同的大小,但它们的最大可能宽度是wid = 3 列(可以是任何定义的常量,而不仅仅是 3)。在某些情况下,在处理的第一阶段之后,我会得到如下所示的数据:

myll <- list(matrix(c(0, 0, 0, 1, 1, 0), ncol = 2),
             matrix(c(0), ncol = 1),
             matrix(c(1, 1, 0), ncol = 3),
             matrix(c(1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1), ncol = 7),
             matrix(c(1, 1, 1, 1), ncol = 2))
# [[1]]
#      [,1] [,2]
# [1,]    0    1
# [2,]    0    1
# [3,]    0    0
# 
# [[2]]
#      [,1]
# [1,]    0
# 
# [[3]]
#      [,1] [,2] [,3]
# [1,]    1    1    0
# 
# [[4]]
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,]    1    1    1    0    0    0    1
# [2,]    0    1    0    1    0    0    1
# [3,]    1    1    1    1    0    0    1
# 
# [[5]]
#      [,1] [,2]
# [1,]    1    1
# [2,]    1    1

因此,某些字形可能由于某些原因没有分开。这只发生在最大可能宽度的字形上。此外,矩阵的末尾可能有一些垃圾。我必须将它们分成宽度为ncol = wid 的矩阵,留下最后一块(垃圾)。然后我将这些矩阵存储在列表的单独元素中以获得以下输出:

# [[1]]
#      [,1] [,2]
# [1,]    0    1
# [2,]    0    1
# [3,]    0    0
# 
# [[2]]
#      [,1]
# [1,]    0
# 
# [[3]]
#      [,1] [,2] [,3]
# [1,]    1    1    0
# 
# [[4]]
#      [,1] [,2] [,3]
# [1,]    1    1    1
# [2,]    0    1    0
# [3,]    1    1    1
# 
# [[5]]
#      [,1] [,2] [,3]
# [1,]    0    0    0
# [2,]    1    0    0
# [3,]    1    0    0
# 
# [[6]]
#      [,1]
# [1,]    1
# [2,]    1
# [3,]    1
# 
# [[7]]
#      [,1] [,2]
# [1,]    1    1
# [2,]    1    1

目前我可以借助这些功能实现它

checkGlyphs <- function(gl_m, wid = 3) {
  if (ncol(gl_m) > wid) 
    return(list(gl_m[,1:wid], matrix(gl_m[,-(1:wid)], nrow = nrow(gl_m)))) else
    return(gl_m)
}

separateGlyphs <- function(myll, wid = 3) {
  require("magrittr")

  presplit <- lapply(myll, checkGlyphs, wid) 
  total_new_length <- 
    presplit[unlist(lapply(presplit, is.list))] %>% lapply(length) %>% unlist() %>% sum() +
    as.integer(!unlist(lapply(presplit, is.list))) %>% sum()

  splitted <- vector("list", length = total_new_length)
  spl_index <- 1
  for (i in 1:length(presplit)) 
  {
    if (!is.list(presplit[[i]])) 
    {   
      splitted[[spl_index]] <- presplit[[i]]
      spl_index <- spl_index + 1 
    } else
    { 
      for (j in 1:length(presplit[[i]]))
      {   
        splitted[[spl_index]] <- presplit[[i]][[j]]
        spl_index <- spl_index + 1 
      }
    }
  }

  if (any(lapply(splitted, ncol) > wid)) return(separateGlyphs(splitted, wid)) else
    return(splitted)
}

但我相信有更快速和方便的方法来实现相同的结果(不使用for 循环和这种循环重新分配元素,然后在需要时递归 O_o)。

我将感谢您对这一点提出任何建议,或者为 R 推荐一些 OCR 包。

【问题讨论】:

    标签: r list split ocr expand


    【解决方案1】:

    这应该可以解决问题,final 中的值就是您所追求的。

    combined <- do.call(cbind, lapply(myll, unlist))
    idx <- seq(1, ncol(combined), 2)
    final <- do.call(list, lapply(idx, function(x) combined[, x:(x+1)]))
    

    【讨论】:

    • 是的,但是...它将所有矩阵合并为一个,然后按固定宽度重新拆分它们,但实际上在我的列表中,我可以拥有具有不同列数的矩阵...我写了他们都是一样的,但是错了,我只是想简化一下情况。问题是我不需要接触好的矩阵(照原样复制)并且只对那些太宽的矩阵进行操作。我会编辑我的问题。
    • 请提及用于确定矩阵是否“太宽”的标准(我的假设是 > 2)并确认处理是否是“按固定宽度拆分”,如您在帖子中提到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多