[R] Matrix multiplication and random numbers

RFish tomworthington at talk21.com
Fri Sep 11 18:11:13 CEST 2009


Hi

Sorry I don't seem to have explained what I'm trying to do very clearly.
The piece of code below multiplies the two matrices together a number of
times based on the value in the matmult(InitialPop,1) term in this case one
(year), this gives me the end population for the analysis. 

InitialPop<-matrix(c(500,0,0,0,0,0,0))

matmult<-function(InitialPop,N){
mat3<-matrix(c(0,rnorm(1,0.6021,0.0987),0,0,0,0,0,0,0,rnorm(1,0.6021,0.0987),0,0,0,0,1.9,0,0,rnorm(1,0.6021,0.0987),0,0,0,4.8,0,0,0,rnorm(1,0.6021,0.0987),0,0,9.7,0,0,0,0,rnorm(1,0.6021,0.0987),0,18,0,0,0,0,0,rnorm(1,0.6021,0.0987),32.6,0,0,0,0,0,0),nrow=7)

for (i in 1:N){
PVAmatrix<-matrix(c(0,rnorm(1,0.6021,0.0987),0,0,0,0,0,0,0,rnorm(1,0.6021,0.0987),0,0,0,0,1.9,0,0,rnorm(1,0.6021,0.0987),0,0,0,4.8,0,0,0,rnorm(1,0.6021,0.0987),0,0,9.7,0,0,0,0,rnorm(1,0.6021,0.0987),0,18,0,0,0,0,0,rnorm(1,0.6021,0.0987),32.6,0,0,0,0,0,0),nrow=7)
mat3<-mat3%*%PVAmatrix
}
ans<-mat3 %*% InitialPop
return(ans)
}
matmult(InitialPop,1)

The problem i have is to repeat this process say 1000 times and store this
output in a format I can export easily whilst maintaining the randomness of
the result, so that every end population is different. 

Any help would be brilliant

Tom  


 



Chris Stubben wrote:
> 
> 
> RFish wrote:
>> 
>> I new to using R and am struggling with some matrix multiplication. 
>> 
> 
> I'm not sure what you're trying to print, but you could place this vector
> in an expression
> 
> mat3<-expression(c(0,rnorm(1,0.6021,0.0987),0,0,0,0,0,0,0,rnorm(1,0.6021,0.0987),0,0,0,0,1.9,0,0,rnorm(1,0.6021,0.0987),0,0,0,4.8,0,0,0,rnorm(1,0.6021,0.0987),0,0,9.7,0,0,0,0,rnorm(1,0.6021,0.0987),0,18,0,0,0,0,0,rnorm(1,0.6021,0.0987),32.6,0,0,0,0,0,0))
> 
> # and then evaluate to get a new matrix each time
> matrix(eval(mat3), nrow=7)
> 
> #I think this may be easier to follow. First create a matrix of zeros,
> stick in fertilities and then add random survival probabilities each time
> 
> 
> mat3<-diag(0,7)
> #fertilities
> mat3[1,3:7]<-c(1.9, 4.8, 9.7, 18, 32.6)
> # random survival on sub-diagonal
> mat3[row(mat3)==col(mat3)+1]<-rnorm(6,0.6021,0.0987)
> 
> 
> # and if you want to project the population over 10 time steps in a loop ?
> 
> n<-matrix(c(500,0,0,0,0,0,0))
> 
> popsize <- matrix(numeric(7 * 10), nrow = 7)
>  for (i in 1:10) {
>         popsize[, i] <- n
>          mat3[row(mat3)==col(mat3)+1]<-rnorm(6,0.6021,0.0987)
>          n <- mat3 %*% n
>     }
> 
> 
>      [,1]     [,2]     [,3]     [,4]      [,5]      [,6]       [,7]     
> [,8]
> [1,]  500   0.0000   0.0000 531.6256 709.89940 940.19337 1697.52862
> 3403.6610
> [2,]    0 352.5116   0.0000   0.0000 298.97874 424.71160  561.32525
> 1027.1605
> [3,]    0   0.0000 279.8029   0.0000   0.00000 231.45988  316.83352 
> 424.8883
> [4,]    0   0.0000   0.0000 147.8957   0.00000   0.00000  136.36804 
> 220.7370
> [5,]    0   0.0000   0.0000   0.0000  96.92715   0.00000    0.00000 
> 108.6551
> [6,]    0   0.0000   0.0000   0.0000   0.00000  69.87527    0.00000   
> 0.0000
> [7,]    0   0.0000   0.0000   0.0000   0.00000   0.00000   65.86229   
> 0.0000
> 
> 
> Chris Stubben
> 
> 

-- 
View this message in context: http://www.nabble.com/Matrix-multiplication-and-random-numbers-tp25365184p25403899.html
Sent from the R help mailing list archive at Nabble.com.




More information about the R-help mailing list