我有一个名为results2的8X11矩阵的数组,我试图迭代地做两件事(~1000次)。
到目前为止我所拥有的是:
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
答案 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)