Обновление матрицы и дисперсии после цикла
У меня есть массив с матрицей 8X11 под названием results2, и я пытаюсь сделать две вещи итеративно (~1000 раз).
- случайным образом выбирайте 4 ячейки за раз в матрице и либо добавьте, либо вычтите значение из этого выбора. Значения должны быть добавлены или таким образом (+, -, -, +) или таким образом (-,+,+,-). После выполнения этого сложения / вычитания матрица 8X11 должна иметь обновленную модификацию, и процесс должен повториться.
- рассчитайте и обновите дисперсию для каждой ячейки в матрице 8X11 после каждого цикла и сохраните ее в векторе. В итоге должно быть 88 векторов со значением дисперсии внутри - по 1 на каждую ячейку в матрице.
То, что я до сих пор это:
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 матриц размером 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 ответ
Во-первых, я бы рекомендовал написать вопрос, чтобы другие могли генерировать матрицу в своей консоли без копирования и вставки.
r2 = matrix( runif(88), 8, 11 )
генерирует матрицу 8 на 11 случайных чисел от 0 до 1. Далее, вам, вероятно, следует использовать больше встроенных функций и векторизовать ваш код. Это поможет вам понять ваши намерения. Код ниже делает то же самое, что вы делаете сейчас? Я думаю, что может. Проработайте это и посмотрите, будет ли это. Если этого не произойдет, попробуйте упростить ваш код аналогичным образом, чтобы его было легче понять.
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)