# Optimization of correlation calculation

How can I make the following line of code run faster? Is there a way to do this calculation as a matrix vs vector than vector vs vector?

In the code below, f is a matrix with one more row than vector. f has many columns and vector has only one column.

vector=RandomReal[1,100000];
f=RandomReal[1,{100001,520}];
pearson = Map[Correlation[f[[2 ;;, #]], vector] &, Range[5, Dimensions[f][]]];


Let's separate sampling from the computation.

BlockRandom[SeedRandom;
vector = RandomReal[1, 100000];
f = RandomReal[1, {100001, 520}];
]


Here is doing it your way:

In:= AbsoluteTiming[
pearson2 =
Map[Correlation[f[[2 ;;, #]], vector] &,
Range[5, Dimensions[f][]]];]

Out= {5.865713, Null}


Of course you lose of standartization of vector. The solution is to use Correlation of two matrices:

In:= AbsoluteTiming[
pearson1 = Correlation[f[[2 ;;, 5 ;;]], Transpose[{vector}]];
]

Out= {3.229262, Null}


Results are equal, of course:

In:= Norm[pearson1 - pearson2]

Out= 7.37439*10^-16

• excellent.. that is exactly what I was looking for. thanks a lot! – preeti Nov 22 '12 at 16:22