【问题标题】:R: creating a matrix with unknown number of rowsR:创建一个行数未知的矩阵
【发布时间】:2012-03-04 07:42:24
【问题描述】:

我编写了下面的代码来生成一个矩阵,其中包含对我来说相当复杂的模式。在这种情况下,我通过反复试验确定完成的矩阵中有 136 行。

我可以提前写一个函数来计算矩阵的行数,但是这个函数会有点复杂。在此示例中,矩阵中的行数 = ((4 * 3 + 1) + (3 * 3 + 1) + (2 * 3 + 1) + (1 * 3 + 1)) * 4。

是否有一种简单有效的方法可以在 R 中创建矩阵,而无需硬连线矩阵语句中的行数?换句话说,有没有一种简单的方法可以让 R 在使用 for 循环时根据需要简单地将一行添加到矩阵中?

我提出了一种解决方案,它在每次通过循环时都使用 rbind,但这似乎有点令人费解,我想知道是否有更简单的解决方案。

对不起,如果这个问题与之前的问题是多余的。我今天无法使用本网站上的搜索功能或使用互联网搜索引擎找到类似的问题,但我想我过去曾在某处发现过类似的问题。

以下是 2 组示例代码,一组使用 rbind,另一组我使用反复试验来提前设置 nrow=136。

感谢您的任何建议。

v1     <- 5
v2     <- 2
v3     <- 2
v4     <- (v1-1)

my.matrix <- matrix(0, nrow=136, ncol=(v1+4) )

i = 1

for(a in 1:v2) {
  for(b in 1:v3) {
    for(c in 1:v4) {
      for(d in (c+1):v1) {

        if(d == (c+1)) l.s = 4 
        else           l.s = 3

        for(e in 1:l.s) {

          my.matrix[i,c] = 1

            if(d == (c+1)) my.matrix[i,d]  = (e-1)
            else           my.matrix[i,d]  =  e

          my.matrix[i,(v1+1)] = a
          my.matrix[i,(v1+2)] = b
          my.matrix[i,(v1+3)] = c
          my.matrix[i,(v1+4)] = d

          i <- i + 1

        }
      }
    }
  }
}

my.matrix2 <- matrix(0, nrow=1, ncol=(v1+4) )
my.matrix3 <- matrix(0, nrow=1, ncol=(v1+4) )

i = 1

for(a in 1:v2) {
  for(b in 1:v3) {
    for(c in 1:v4) {
      for(d in (c+1):v1) {

        if(d == (c+1)) l.s = 4 
        else           l.s = 3

        for(e  in 1:l.s) {

          my.matrix2[1,c] = 1

          if(d == (c+1)) my.matrix2[1,d]  = (e-1)
          else           my.matrix2[1,d]  =  e

          my.matrix2[1,(v1+1)] = a
          my.matrix2[1,(v1+2)] = b
          my.matrix2[1,(v1+3)] = c
          my.matrix2[1,(v1+4)] = d

          i <- i+1

          if(i == 2) my.matrix3 <- my.matrix2
          else       my.matrix3 <- rbind(my.matrix3, my.matrix2)

          my.matrix2 <- matrix(0, nrow=1, ncol=(v1+4) )

        }
      }
    }
  }
}

all.equal(my.matrix, my.matrix3)

【问题讨论】:

标签: r


【解决方案1】:

如果你对矩阵的大小有一些上限, 你可以创建一个矩阵 大到足以容纳所有数据

my.matrix <- matrix(0, nrow=v1*v2*v3*v4*4, ncol=(v1+4) )

并在最后截断它。

my.matrix <- my.matrix[1:(i-1),]

【讨论】:

    【解决方案2】:

    这是执行此操作的通用形式。你可以根据你的问题调整它

    matrix <- NULL
    for(...){
     ...
     matrix <- rbind(matriz,vector)
    }
    

    其中向量包含行元素

    【讨论】:

    • rbind 需要它的两个参数具有相同的尺寸
    【解决方案3】:

    我今天偶然发现了这个解决方案:将matrix 转换为data.frame。当for-loop 需要新行时,这些行会自动添加到data.frame。然后,如果需要,您可以在最后将 data.frame 转换回 matrix。我不确定这是否构成类似于rbind 的迭代使用。大data.frames 可能会变得非常慢。我不知道。

    my.data <- matrix(0, ncol = 3, nrow = 2)
    my.data <- as.data.frame(my.data)
    
    j <- 1
    
    for(i1 in 0:2) {
         for(i2 in 0:2) {
              for(i3 in 0:2) {
    
                        my.data[j,1] <- i1
                        my.data[j,2] <- i2
                        my.data[j,3] <- i3
    
                        j <- j + 1
    
              }
         }
    }
    
    my.data
    my.data <- as.matrix(my.data)
    dim(my.data)
    class(my.data)
    

    编辑:2015 年 7 月 27 日

    您也可以删除第一个matrix 语句,创建一个空的data.frame,然后在最后将data.frame 转换为matrix

    my.data <- data.frame(NULL,NULL,NULL)
    
    j <- 1
    
    for(i1 in 0:2) {
         for(i2 in 0:2) {
              for(i3 in 0:2) {
    
                        my.data[j,1] <- i1
                        my.data[j,2] <- i2
                        my.data[j,3] <- i3
    
                        j <- j + 1
              }
         }
    }
    
    my.data
    my.data <- as.matrix(my.data)
    dim(my.data)
    class(my.data)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      相关资源
      最近更新 更多