2013-12-19 49 views
-1

我有一個名爲results2的8X11矩陣的數組,我試圖迭代地做兩件事(〜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個矢量各有一個方差值。

謝謝。

順便說一句,結果只是一個13000矩陣,每個8X11的3D陣列。在結果矩陣#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

您能否爲我們提供一個小型的練習數據集?什麼是「結果」?另外,儘可能簡化代碼將有助於獲得更快的答案。 – kdauria

+0

凱文,我加了一個例子。這是儘可能簡化,我可以得到它。 – user3067923

回答

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矩陣的4個隨機元素,請參閱下面的代碼。

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