循环后更新矩阵和方差

时间:2013-12-19 03:06:41

标签: r loops vector matrix variance

我有一个名为results2的8X11矩阵的数组,我试图迭代地做两件事(~1000次)。

  1. 在矩阵中一次随机选择4个单元格,并为该选择添加或减去一个值。需要以这种方式(+, - , - ,+)或这种方式( - ,+,+, - )添加值。执行此添加/减法后,8X11矩阵应对其执行更新修改,并且应重复该过程。
  2. 计算并更新每个循环后8X11矩阵中每个单元格的方差,并将其保存到向量中。最后应该有88个向量,其中有一个方差值 - 矩阵中每个单元格为1。
  3. 到目前为止我所拥有的是:

    r2 <- results[2,,]
    dat <- r2[sample(prod(dim(r2)),4)] #randomly samples from the 8X11 matrix
    dat <- as.matrix(dat) 
    
    sampleRand <- function(dat) {
    x_min = seq(0,min(sample(dat,4)), by=0.01) #random sampling for 4 cells and finds range       from 0 to the min of that sample
    x.min = sample(x_min,1) # randomly selects the min to use to add or subtract by
    flip = sample(0:1,1,rep=T) #if flip is = 1 then do +,-,-,+ if flip = 0 then do -,+,+,-
    if(flip > 0) {
      dat[1,1] = dat[1,1] + x.min
      dat[2,1] = dat[2,1] - x.min
      dat[3,1] = dat[3,1] - x.min
      dat[4,1] = dat[4,1] + x.min
      if (dat[1,1] < 0 ||
          dat[2,1] < 0 ||
          dat[3,1] < 0 ||
          dat[4,1] < 0) 
    { print("FALSE")
    }
    } else if(flip == 0) { 
      dat[1,1] = dat[1,1] - x.min
      dat[2,1] = dat[2,1] + x.min
      dat[3,1] = dat[3,1] + x.min
      dat[4,1] = dat[4,1] - x.min
    } else if (dat[1,1] < 0 ||
              dat[2,1] < 0 ||
              dat[3,1] < 0 ||
              dat[4,1] < 0)
    { print("FALSE")
    }
    }
    

    上述代码的问题(除了丑陋)是我从8X11矩阵中选择值并修改它们。我不是直接在8X11矩阵中修改它们。我怎么能这样做?

    此外,如何计算8X11矩阵中每个单元格的方差,并在每次迭代后对该单元格进行方差值更新?理想情况下,此方差值将保存为自己的向量。所以最后应该有88个向量,每个向量的方差值。

    感谢。

    顺便说一句,结果只是一个包含13,000个矩阵的3D数组,每个矩阵为8X11。结果中的矩阵#2的示例是:

    results[2,,]
          [,1]       [,2]      [,3]      [,4]      [,5]      [,6]      [,7]
    [1,] 0.1108446 0.09536505 0.6639205 0.5750731 0.3526045 0.5534660 0.8835108
    [2,] 0.2762736 0.16588542 0.5556568 0.6600122 0.4832881 0.4584993 1.0334293
    [3,] 0.1313672 0.00000000 0.5799588 0.5835488 0.7482058 0.5714304 0.8910430
    [4,] 0.1815236 0.50803010 0.4826228 0.7011605 0.5161530 0.3057819 0.9230045
    [5,] 0.1363721 0.77955695 0.5983714 0.5894578 0.5964733 0.8284053 0.7949902
    [6,] 0.2058215 0.54171493 0.3260954 0.6145317 0.5241678 1.1855122 0.9472204
    [7,] 0.1398614 0.62403905 0.5403183 0.5141039 0.6353840 0.8727070 0.5891284
    [8,] 0.1546674 0.54992965 0.8204701 0.6335292 0.5297555 0.9809781 0.6295093
          [,8]      [,9]     [,10]     [,11]
    [1,] 0.9334862 0.7306472 0.6472618 1.0034951
    [2,] 0.6672198 0.4258317 0.6736558 0.9045543
    [3,] 0.7593824 0.5955351 0.5679406 1.0567393
    [4,] 0.6764162 0.8904367 0.6936535 0.9122004
    [5,] 0.8040301 0.6321197 0.3979384 0.9446451
    [6,] 0.6828278 0.7215308 0.8486158 0.8146954
    [7,] 0.7100341 0.6410416 1.2111213 0.9692271
    [8,] 0.6010656 0.7648455 0.8935872 0.6057215
    

1 个答案:

答案 0 :(得分:0)

首先,我建议编写问题,以便其他人可以在自己的控制台中生成矩阵而无需复制和粘贴。

r2 = matrix( runif(88), 8, 11 )

在0和1之间生成一个8乘11的随机数矩阵。接下来,您应该使用更多内置函数并对代码进行矢量化。这将使您更容易理解您的意图。下面的代码是否与您现在正在做的事情相同?我认为可能。通过它,看看它是否确实如此。如果没有,那么尝试以类似的方式简化代码,以便更容易理解。

r2 = matrix( runif(88), 8, 11 )
dat = sample(r2,4)

sampleRand = function(dat) {
  x.min = sample( seq(0, min(dat), by=0.01), 1 )
  flip = sample(c(-1,1),1)
  dat = dat + flip*c(1,-1,-1,1)*x.min
  if( any(dat<0) ) print("FALSE")
}

您可能还想对R中的“赋值运算符”和“替换函数”进行一些研究。要更新r2矩阵的四个随机元素,请参阅下面的代码。

cells = sample(length(r2),4)
r2[ cells ] = r2[ cells ] + c(1,-1,-1,1)