Re: large lists with variable and if condition (vrs. 8.0.4)

*To*: mathgroup at smc.vnet.net*Subject*: [mg124714] Re: large lists with variable and if condition (vrs. 8.0.4)*From*: DrMajorBob <btreat1 at austin.rr.com>*Date*: Thu, 2 Feb 2012 04:54:11 -0500 (EST)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com

This is fast: Timing[ b = Map[If[# != 0, .75 (1 - #^2), 0] &, Clip[Outer[Subtract, data, data]/x, {-1, 1}, {0, 0}], {2}] + SparseArray[{Band[{1, 1}] -> .75}, {leg, leg}];] but it depends on zeroes occurring ONLY on the diagonal in the Outer result. That's a fair bet for the random data posted, but I'm not sure the poster wanted that limitation. In addition to the codes I already posted, I'll add this one: Clear[f, mat4, x] f[x_] = Piecewise[{{.75 (1 - x^2), -1 < x < 1}}]; mat4[bw_Real] := Map[f, Outer[Subtract, data, data]/bw, {2}] Timing[four = mat4[0.1];] {0.040412, Null} Bobby On Wed, 01 Feb 2012 02:50:09 -0600, Bill Rowe <readnews at sbcglobal.net> wrote: > On 1/31/12 at 5:39 AM, kristophs.post at web.de (Chris) wrote: > >> I would like to construct a large list or large table with some data >> and one unknown variable which I need for optimization purposes in >> say a for loop. Constructing the whole list at each iteration is >> time consuming and slows the optimization down. > >> First, I present some code that works just fine in order to get the >> idea: > >> (*inputs) leg = 100; data = RandomReal[{}, leg]; > >> (*constructing the list with the data in which g is a non-specfied >> variable*) Clear[list, list2, tab]; list = Table[(data[[i]] - >> data[[leg - i + 1]])/g, {i, 1, leg}]; > > a faster way to construct this table would be > > list = (data - Reverse[data])/g; > > This avoids using Part which can slow things down. > >> (*specifying the function and the result*) tab[k_] := list /. g >> ->k; tab[1] > >> Now the following code does not work and I don't know why. > >> list2= Table[If[Abs[(data[[j]]-data[[i]])/x]<1.,.75 (1.-((data[[j]]- >> data[[i]])/x)^2),0.],{i,1,leg},{j,1,leg}]; mat[bw_Real]:=list/.x->bw > >> It seems to me, when looking at list2, that Mathematica is not >> evaluating the when-part of the if-function when the if-part depends >> on the unknown variable. > > Mathematica is not evaluating this because it cannot. It is > impossible to determine whether > > Abs[(data[[j]]-data[[i]])/x] > > is less than one if x is not defined. > >> Constructing the list as: >> mat[bw_Real]:=Table[If[Abs[(data[[j]]-data[[i]])/bw]<1.,.75 (1.- >> ((data[[j]]-data[[i]])/bw)^2),0.],{i,1,leg},{j,1,leg}]; is not an >> option because it slows things down. > > Here too, the use of Part can be avoided. > > Using your code I get with x = .5: > > In[34]:= Timing[ > list2 = Table[ > If[Abs[(data[[j]] - data[[i]])/x] < > 1., .75 (1. - ((data[[j]] - data[[i]])/x)^2), 0.], {i, 1, > leg}, {j, 1, leg}];] > > Out[34]= {0.053099,Null} > > Using functional constructs I get: > > In[35]:= Timing[ > b = Map[If[# != 0, .75 (1 - #^2), 0] &, > Clip[Outer[Subtract, data, data]/x, {-1, 1}, {0, 0}], {2}] + > SparseArray[{Band[{1, 1}] -> .75}, {leg, leg}];] > > Out[35]= {0.027723,Null} > > and > > In[36]:= list2 == b > > Out[36]= True > > Note, things will be slower if you defer assigning a value to x > then later assign a value using a replacement rule. Pattern > matching definitely tends to slow things down. Faster would be > to use Block to temporarily assign a value to x. That is: > > In[37]:= d = list2/g; > > In[38]:= Timing[c = d /. g -> 1;] > > Out[38]= {0.015705,Null} > > In[39]:= Timing[y = Block[{g = 1}, d];] > > Out[39]= {0.004637,Null} > > In[40]:= c == y > > Out[40]= True > > -- DrMajorBob at yahoo.com