4
\$\begingroup\$

I have two matrices, the first one is mat 2000*500, the second one is 6000*500 tep I did this code for some analysis to get another matrix that has a specific elements.

Problem is : This code is very very slow, I need to make faster.Any suggestion to do so is welcome

mat=matrix(sample(c(0,1,2),200,replace =T),nrow=500,ncol=2000)
tep =matrix(rnorm(200,5,2),nrow=500,ncol=6000)`

The code is trying to create one matrix (500 row by 2000 col). Its elements depend on the following : Let the new matrix is A .

if mat[1,1] = 0 then A[1,1]=tep[1,1]/(sum(tep[1,1:3]))
if mat[1,1] = 1 then A[1,1]=tep[1,2]/(sum(tep[1,1:3]))
if mat[1,1] = 2 then A[1,1]=tep[1,3]/(sum(tep[1,1:3]))
if mat[1,2] = 0 then A[1,2]=tep[1,4]/(sum(tep[1,4:6]))
if mat[1,2] = 1 then A[1,2]=tep[1,5]/(sum(tep[1,4:6])) 
if mat[1,2] = 2 then A[1,2]=tep[1,6]/(sum(tep[1,4:6]))`
...... 

and so on.. The one column in mat is corresponding to three columns in tep. Every three values in three columns in matrix tep at a j row is a group we calculate from each group there will be one value according to the example above, so we will end up with a 500 row by 2000 column matrix.

allele=c(0,1,2)
A=matrix(nrow=500,ncol=2000)
 start=seq(1,6000,3)
for(k in 1:500){
for(i in 1:2000){
for(j in start){
  temp.z= mat[k,i]
  temp.pl=tep[k,j:(j+2)]
  loc=which(allele==temp.z)
  temp.pl=temp.pl[loc]/(sum(temp.pl))
  A[k,i]=temp.pl
  rm(temp.pl,temp.z,loc)

      }
   }
}
\$\endgroup\$
1
  • \$\begingroup\$ Your explanation is not very clear. Maybe you could rewrite it a bit. Also, the code at the end does not seem to modify A, which I think is what you are trying to compute. \$\endgroup\$
    – toto2
    Oct 22, 2014 at 0:06

1 Answer 1

3
\$\begingroup\$

Try the following:

mat0 <- tep[, c(TRUE, FALSE, FALSE)]
mat1 <- tep[, c(FALSE, TRUE, FALSE)]
mat2 <- tep[, c(FALSE, FALSE, TRUE)]

denominator <- mat0 + mat1 + mat2
numerator   <- mat0 * (mat - 1) * (mat - 2) / (0 - 1) / (0 - 2) +
               mat1 * (mat - 0) * (mat - 2) / (1 - 0) / (1 - 2) +
               mat2 * (mat - 0) * (mat - 1) / (2 - 0) / (2 - 1)

A <- numerator / denominator
\$\endgroup\$
0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.