Re: correlation function
- To: mathgroup at smc.vnet.net
- Subject: [mg128774] Re: correlation function
- From: Dana DeLouis <dana01 at me.com>
- Date: Sat, 24 Nov 2012 02:30:07 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
> ListConvolve and ListCorrelate should give same results when given right parameters. Hi. They are very similar, but they do work differently. It would help if you gave a 'small' example of what you are really trying to do. Some thoughts on why you are not getting results you expect could be: -Your FourierParameter is not set correctly. -You are cutting off your data too much with {1,1} -You are rotating the second vector, when you don't mean to. With you large data (ie 309 data points), I get the same results. v = << Your Data as posted >> v//Length 309 SetOptions[{Fourier,InverseFourier},FourierParameters->{1,-1}] ; ListCorrelate[v,v,{1,1}]; InverseFourier[Fourier[Reverse[v]]*Fourier[v]]//Reverse; %%==% True InverseFourier[Fourier[v]^2]; ListConvolve[v,v,{1,1}]; %%==% True With either way, the above are always equal. Again, it depends on what you are doing. >> ListConvolve and ListCorrelate should give same results They operate slightly differently. Here, we don't rotate v2, by using 0, to make it easier to see. v1=v2={a,b,c}; // Here, we keep v2 as is, and shift it right to left ListCorrelate[v1,v2,{1,1},0] {a^2+b^2+c^2,a b+b c,a c} // Here, we reverse v2, but shift it left to right ListConvolve[v1,v2,{1,1},0] {a^2,2 a b,b^2+2 a c} // So, they will always be slightly different. By reversing v2, it's the same as ListConvolve, except we are going left to right. // This is just the opposite of right to left. Add 'Reverse to make this equal to ListConvolve. ListConvolve[v1,v2//Reverse,{1,1},0] {a c,a b+b c,a^2+b^2+c^2} This is the same as ListCorrelate, only backwards. As a fun side note, when I've done InverseFourier[Fourier[v]^2 ] in other languages, it was to square a very large number. For example, to do slow school-method multiplication, one would not chop the data off with {1,1}, but use {1,-1}. Here's an example of 123 * 123 n=123; v=n//IntegerDigits {1,2,3} // Don't rotate (use 0), and have the last digit of v2 (ie 9), end when it gets to the last digit of v1 (use -1) ListConvolve[v,v,{1,-1},0] {1,4,10,12,9} // This is the correct answer in Base 10. To adjust, for the 12, we keep the 2, and carry the 1. 10+1 == 1, carry the 1, etc. // The function FromDigits with default base 10 does all this for us: FromDigits[%] 15129 // Same Answer: n*n 15129 Here's a technique to try to see what's going on. Experiment with ListCorrelate as well. // Here is what you have ListConvolve[{a,b,c},{d,e,f},{1,1}] //MatrixForm // This is what you are really doing. You're rotating {d,e,f} around. ListConvolve[{a,b,c},{d,e,f},{1,1},{d,e,f},Times,Plus] //MatrixForm // Same, but not adding. ListConvolve[{a,b,c},{d,e,f},{1,1},{d,e,f},Times,List] //MatrixForm // Different Start / End ListConvolve[{a,b,c},{d,e,f},{1,1},0,Times,List] //MatrixForm ListConvolve[{a,b,c},{d,e,f},{1,-1},0,Times,List] //MatrixForm Now that I've seen the above, I may have said things backwards with regards to v1,v2. However, the results are the same. Good Luck. = = = = = = = = = = HTH :>) Dana DeLouis Mac & Mathematica 8 = = = = = = = = = = On Friday, November 23, 2012 3:38:21 AM UTC-5, jure lapajne wrote: > Professor (physicist) said this function is called correlation = function. Than I talked to someone from mathematics department and he = said it's some sort of discrete convolution, so it really depends on = person, how he/she calls it. ListConvolve and ListCorrelate should give = same results when given right parameters. I think there is something = strange about my data (linked in previous post), because I also have = some other data and when I use them I get correct (same) results. I = tried all the code in above answers and with given data nothing works. I = think I'll just use fourier transform method because it returns = symmetric data (which is correct) in contrast to ListCorrelate and = ListConvolve which return asymmetric data. > > Thank you all.