R:将矩阵分割成任意数量的 block

标签 r matrix block

假设我有一个值矩阵

    set.seed(1)
    A <- matrix(runif(25),ncol=5)

我想计算这个大小近似相等的矩阵内近似正方形邻域的一些统计数据。这两种输出中的任何一种都可以:

    N1 <-  matrix(c(rep(c("A","A","B","B","B"),2),rep(c("C","C","D","D","D"),3)),ncol=5)
    N2 <-  matrix(c(rep(c("A","A","A","B","B"),3),rep(c("C","C","D","D","D"),2)),ncol=5)
    N1
         [,1] [,2] [,3] [,4] [,5]
    [1,] "A"  "A"  "C"  "C"  "C" 
    [2,] "A"  "A"  "C"  "C"  "C" 
    [3,] "B"  "B"  "D"  "D"  "D" 
    [4,] "B"  "B"  "D"  "D"  "D" 
    [5,] "B"  "B"  "D"  "D"  "D" 

    N2
         [,1] [,2] [,3] [,4] [,5]
    [1,] "A"  "A"  "A"  "C"  "C" 
    [2,] "A"  "A"  "A"  "C"  "C" 
    [3,] "A"  "A"  "A"  "D"  "D" 
    [4,] "B"  "B"  "B"  "D"  "D" 
    [5,] "B"  "B"  "B"  "D"  "D" 

其他近似值也可以,因为我总是可以旋转矩阵。然后我可以使用这些邻域矩阵通过 tapply() 来计算统计数据,如下所示:

    tapply(A,N1,mean)
            A         B         C         D 
    0.6201744 0.5057402 0.4574495 0.5594227

我想要的是一个函数,它可以使我成为一个具有任意数量的 block 状邻域(如N1N2)的任意维度的矩阵。我很难弄清楚这样的函数如何处理所需数量的 block 甚至不是正方形的情况。 N1N2 有 4 个社区,但假设我想要 5 个社区来输出类似这样的内容:

    N3 <-  matrix(c("A","A","B","B","B","A","A","C","C","C","D","D","C","C","C",
            "D","D","E","E","E","D","D","E","E","E"),ncol=5)
         [,1] [,2] [,3] [,4] [,5]
    [1,] "A"  "A"  "D"  "D"  "D" 
    [2,] "A"  "A"  "D"  "D"  "D" 
    [3,] "B"  "C"  "C"  "E"  "E" 
    [4,] "B"  "C"  "C"  "E"  "E" 
    [5,] "B"  "C"  "C"  "E"  "E" 

有谁知道现有的函数可以进行这种拆分,或者对如何进行拆分有任何想法吗?谢谢!

[[编辑]] 考虑到文森特的建议,我的最终功能是:

    DecideBLocks <- function(A,nhoods){
        nc <- ncol(A)
        nr <- nrow(A)
        nhood_side <- floor(sqrt((nc*nr)/nhoods))
        Neighborhoods <- matrix(paste(ceiling(col(A)/nhood_side), ceiling(row(A)/nhood_side), sep="-"), nc=ncol(A)) 
        nhoods.out <- length(unique(c(Neighborhoods)))
        if (nhoods.out != nhoods){
            cat(nhoods.out,"neighborhoods created.\nThese were on average",nhood_side,"by",nhood_side,"cells\nit's a different number than that stated the function tries to round things to square neighborhoods\n")
        }
        return(Neighborhoods)
    }
    A <- matrix(rnorm(120),12)
    B <- DecideBLocks(A,13)

最佳答案

您可以尝试使用 rowcol 函数: 他们将问题简化为一维问题。 下面定义了大小最大为 2*2 的 block 。

matrix( 
  paste(
    ceiling(col(A)/2), 
    ceiling(row(A)/2), 
    sep="-"), 
  nc=ncol(A) 
)

关于R:将矩阵分割成任意数量的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9430950/

相关文章:

arrays - R如何存储锯齿状数组

c++ - 在 C++ 中返回多个矩阵( Armadillo 库)

c - 显示输入数字指定的矩阵的对角线

css - 鼠标悬停时显示div

iphone - objective c 传递 block 作为 OOP 的参数

r - 控制点阵密度图中绘图符号的 alpha 值

r - 如何将用户定义的数据 C 结构用于 R 包

r - 在 R 中拆分 CamelCase

python - Numpy:将稀疏矩阵转换为 ndarray

ios - 从 Afnetwork block 更新 ios ui 元素时出现延迟