R:分割矩阵成块
问题描述:
的任意数量的说我有值R:分割矩阵成块
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
我要的是一个功能,可以让我任意维度的矩阵与块状街区像N1
或任意数量的N2
。我很难找出这样一个函数如何处理所需块数不是偶数的情况。 N1
和N2
有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"
有谁知道现有的功能,可以做这样的分裂,或者对如何使一个任何想法?谢谢!
[编辑] 我的最终功能,考虑到文森特的建议是:近youree中心
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)
答
你可以尝试用row
和col
功能发挥: 他们问题缩小到一维的。 以下定义最多2 * 2的大小块。
matrix(
paste(
ceiling(col(A)/2),
ceiling(row(A)/2),
sep="-"),
nc=ncol(A)
)
答
你可以选择你bdeep(行规范)和bwide(CO-SPEC)的参数以您喜欢的任何方式创建矩阵尺寸,并使用这个简单的函数来构建矩阵。只要bwide和bdeep相等,并且nrow == ncol,你应该得到方形子矩阵。
mkblk <- function(bwide, bdeep, nrow, ncol){
bstr1 <- c(rep("A", bdeep), rep("B", nrow-bdeep))
bstr2 <- c(rep("C", bdeep), rep("D", nrow-bdeep))
matrix(c(rep(bstr1, bwide), rep(bstr2, ncol-bwide)), ncol=ncol, nrow=nrow)}
mkblk(2,2,5,5)
[,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"
#Test of your strategy
tapply(A, mkblk(2,2,5,5), mean)
A B C D
0.6201744 0.5057402 0.4574495 0.5594227
+0
谢谢迪文,文森特打得更接近一点,但这里也有不错的想法。 – 2012-02-24 16:42:06
谢谢文森特,我想我可以通过修补这个东西来得到我需要的东西 – 2012-02-24 16:42:15