2015-05-29 110 views
0

我正在做某種光學字符識別並面臨以下問題。我將字形存儲在二進制矩陣列表中,它們可以具有不同的大小,但它們的最大可能寬度是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循環和這種enlooped重新分配的元素,然後遞歸如果需要O_o)。

我會心存感激的點什麼建議,或者在final推薦一些OCR-包河

回答

0

這應該做的伎倆,與價值觀是你追求的。

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)])) 
+0

是的,但是......它合併在一個所有矩陣,然後再通過分割固定寬度他們,但真正在我的名單,我可以有不同的列數的矩陣...我寫的他們都是同樣的,但它的錯誤,我只是想簡化這種情況。問題是我不需要觸摸好矩陣(照原樣複製),只能使用太寬的矩陣。我會編輯我的問題。 – inscaven

+0

請提及用於確定矩陣是否「太寬」(我的推定是> 2)的標準,並確認處理是否按照您在帖子中提到的「按照固定寬度分割」。 – Ricky