Обновление матрицы и дисперсии после цикла

У меня есть массив с матрицей 8X11 под названием results2, и я пытаюсь сделать две вещи итеративно (~1000 раз).

  1. случайным образом выбирайте 4 ячейки за раз в матрице и либо добавьте, либо вычтите значение из этого выбора. Значения должны быть добавлены или таким образом (+, -, -, +) или таким образом (-,+,+,-). После выполнения этого сложения / вычитания матрица 8X11 должна иметь обновленную модификацию, и процесс должен повториться.
  2. рассчитайте и обновите дисперсию для каждой ячейки в матрице 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)
Другие вопросы по тегам