-1

考虑一个具有r行和c列并且包含0 到;v之间的整数的矩阵。v-1在以下示例中r=4c=2、 和v=6

L <- c(0,1,1,2,0,1,2,3)
(x <- matrix(L,nrow=4,ncol=2,byrow = TRUE))

 ## 0 1 
 ## 1 2 
 ## 0 1 
 ## 2 3

目标是按列关联矩阵生成r*c(行)v,如下所示:

  • 每行对应于原始矩阵的一个元素(按列优先顺序,即在此处的示例中,第 4 行对应于x[4,1],第 5 行对应于x[1,2]
  • 找到每个元素上方和下方的“邻居”,从矩阵的顶部到底部(循环地)环绕;计算 的每个值的相邻元素的数量v

例如x[1,1],矩阵1(. 该行的其余部分设置为零:20:(v-1)

  rownames  0  1  2  3  4  5            
  [1]       0  1  1  0  0  0

下一个元素 ( x[2,1])0在两侧(上方和下方)都有,因此第一列(对应于 0)设置为 2,其余元素为零。

  [2]       2  0  0  0  0  0

上面示例的完整矩阵是:

  rownames  0  1  2  3  4  5            
  [1]       0  1  1  0  0  0
  [2]       2  0  0  0  0  0
  [3]       0  1  1  0  0  0
  [4]       2  0  0  0  0  0
  [5]       0  0  1  1  0  0
  [6]       0  2  0  0  0  0
  [7]       0  0  1  1  0  0  
  [8]       0  2  0  0  0  0 

行总和均为 2。

4

1 回答 1

1
L =c(0,1,1,2,0,1,2,3)
x=matrix(L,nrow=4,ncol=2,byrow = TRUE)

可能有一种更清洁的方法来做到这一点:

wrapind <- function(i,n)
    ifelse((r <- i %% n) == 0, n, r)


n <- nrow(x)
v <- 6
incmat <- matrix(0,ncol=v,nrow=prod(dim(x)),
                 dimnames=list(NULL,0:(v-1)))
k <- 1
for (i in seq(ncol(x)))
    for (j in seq(nrow(x))) {
        cat(i,j,k,"\n")  ## unnecessary
        tt <- table(as.character(x[wrapind(c(j-1,j+1),n),i]))
        incmat[k,names(tt)] <- tt
        k <- k+1
    }
于 2013-02-12T19:18:15.893 回答