R如何使用循环函数来创建矩阵

时间:2015-04-23 15:18:15

标签: r matrix

我想创建一个由一系列较小的矩阵组成的大矩阵。有30个小的30 x 3153矩阵。每个只有一行1,其余都是0。 1s行的位置从1到30.例如,在第1个矩阵中,1s在第1行,第2行在第2行,等等。

由于我是编程新手,我不知道如何使用循环函数来实现这一点。我不知道如何将变量传递给循环函数。

这是我尝试过的。

  1. 创建了两个0和1的向量。
  2. 构建了一个只有0的29 x 3153矩阵。
  3. 使用miscTools包中的insertRow函数将1s插入根据位置
  4. 然后cbind所有矩阵创建我想要的大矩阵。
  5. 我坚持如何使用循环来实现这一目标。如果有人能帮助我,我将不胜感激。感谢

    vec0=rep.int(0,n)
    vec1=rep.int(1,n)
    uij=matrix(rep(vec0,c-1),nrow=c-1,ncol=n)
    
    Uij=cbind(lapply(uij,insertRow(uij,i,vec1)))
    

2 个答案:

答案 0 :(得分:3)

hold_mat <- list()
for(i in seq(30)){
  mat <- matrix(0, nrow = 30, ncol = 3153)
  mat[i, ] <- 1
  hold_mat[[i]] <- mat
}

bigMatrix <- do.call(rbind, hold_mat)

编辑:这是一个包含来自Matrix包的稀疏矩阵的解决方案:

library(Matrix)
numRows <- 30
numCols <- 3152
hold_mat <- lapply(seq(numRows), function(k) sparseMatrix(i = rep(k, numCols), j = seq(numCols), dims = c(numRows, numCols))) 
bigMatrix <- do.call(rBind, hold_mat)

> str(bigMatrix)
Formal class 'ngCMatrix' [package "Matrix"] with 5 slots
..@ i       : int [1:94560] 0 31 62 93 124 155 186 217 248 279 ...
..@ p       : int [1:3153] 0 30 60 90 120 150 180 210 240 270 ...
..@ Dim     : int [1:2] 900 3152
..@ Dimnames:List of 2
.. ..$ : NULL
.. ..$ : NULL
..@ factors : list()

答案 1 :(得分:1)

想想大矩阵的每一行会是什么样的:

1 - 29 times 0 - 0 - 1 - 28 times 0 - 0 - 0 - 1 - 27 times 0 - ...

基本上你有:

[1 - 30 times 0] x 30 times - 1

重复超过3153行。

所以你可以使用:

row <- c(rep( c(1, rep(0, 30)), 30), 1)
m <- matrix(rep(row, 3153), nrow=3153)

其中:

c(1, rep(0, 30)) # one followed by 30 zeros

rep( c(1, rep(0, 30)), 30) # 1 and 30x 0 repeated 30 times

c(rep( c(1, rep(0, 30)), 30), 1) # 1 and 30x 0 rep 30 times and 1 at the end