Re: Smooth the data in a table, Why this cannot work?
- To: mathgroup at smc.vnet.net
- Subject: [mg62539] Re: Smooth the data in a table, Why this cannot work?
- From: Bill Rowe <readnewsciv at earthlink.net>
- Date: Sun, 27 Nov 2005 02:40:42 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
On 11/26/05 at 2:47 AM, yanshanguke at 163.com (simon yang) wrote:
>Hello, every one. I meet a problem when I smooth the data in a
>table:
>280.00,.000
>282.00,.002
>284.00,.002
>286.00,.000
>288.00,.000
>290.00,.002
>292.00,.003
>294.00,.003
>296.00,.003
>298.00,.011
>300.00,.031
>302.00,.076
>The method I used is:
>For[i=3,i<=9,data[[1,i]][[2]] = (1/35)( -3(data[[1,i-3]][[2]]
>+data[[1,i+3]][[2]]) +12(data[[1,i-2]][[2]] +data[[1,i+2]][[2]])
>+17(data[[1,i-1][[2]] +data[[1,i+1]][[2]])); i++]
>it doen't work
Correct, it won't work. There are two problems above both related to incorrect index syntax. First, in Mathematica the starting index value is 1 not 0. For, i=3, data[[i, i-3]] evaluates to data[[3,0]] which is invalid.
Second, you have an array consisting of two columns and several rows. The syntax data[[i,j]] refers to one element of that array which is a number. The syntac data[[i,j]][[2]] attempts to find part 2 of data element i,j which doesn't exist.
>the function Replace[] also don't work \!\(For[i = 3,
>i = \ 9, Replace[ datatemp, \(data[\([1, i]\)]\)[\([2]\)] ->
>\(1\/35\) \((\(-3\) \
>\((\(data[\([1, i - 2]\)]\)[\([2]\)] + \(data[\([1, i +
>2]\)]\)[\([2]\)])\) +
>12 \((\(data[\([1, i - 1]\)]\)[\([2]\)] + \(data[\([1, i +
>1]\)]\)[\([2]\)])\)
>+
>17 \( data[\([1, i]\)]\)[\([2]\)])\)];
>\(i++\)]\)
Here you have corrected the issue of gettting data[[3,0]] but still have the issue of trying to find a non-existant part.
>Then what should I do ?
Correcting the syntax should fix your problem. But better would be to avoid using the For loop all together.
You appear to be using linear smoothing with coefficients (-3, 12, 17, 12, -3)/35. Either ListConvolve or ListCorrelate will do what you want much more efficiently. That is
In[1]:=
data = {{280., 0.}, {282., 0.002}, {284., 0.002},
{286., 0.}, {288., 0.}, {290., 0.002},
{292., 0.003}, {294., 0.003}, {296., 0.003},
{298., 0.011}, {300., 0.031}, {302., 0.076}};
In[2]:=
ListConvolve[{-3, 12, 17, 12, -3}/35, Last/@data]
Out[2]=
{0.001657142857142857,
0.0003428571428571429,
0.00025714285714285715,
0.0017428571428571428,
0.002914285714285714,
0.0024000000000000002,
0.0033428571428571426,
0.01022857142857143}
appears to be the result you want.
In addition, you might want to look at the package Statistics`DataSmoothing`
--
To reply via email subtract one hundred and four