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

*To*: mathgroup at smc.vnet.net*Subject*: [mg124700] Re: large lists with variable and if condition (vrs. 8.0.4)*From*: "Oleksandr Rasputinov" <oleksandr_rasputinov at ymail.com>*Date*: Wed, 1 Feb 2012 03:49:27 -0500 (EST)*Delivered-to*: l-mathgroup@mail-archive0.wolfram.com*References*: <jg8gi2$13i$1@smc.vnet.net>

On Tue, 31 Jan 2012 10:42:10 -0000, Chris <kristophs.post at web.de> wrote: > Hi > > 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}]; > > (*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. Hence, an error message. > > 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. > > Thanks for answer. > If I understood your question correctly, you simply want the conditional expression to be evaluated with the correct values for data[[i]] and data[[j]]. This does not happen by default because If has the attribute HoldRest, but you can correct the problem by modifying your code as follows: list2 = Table[ If[Abs[(data[[j]]-data[[i]])/x]<1., (* Note use of Evaluate *) Evaluate[.75 (1.-((data[[j]]-data[[i]])/x)^2)], 0. ], {i,1,leg},{j,1,leg} ]; Evaluate can be used in this way to override the non-evaluation due to Attributes (such as HoldRest, HoldFirst, HoldAll, etc.) of any function argument. In fact, this is also needed for the definition of mat, because SetDelayed has HoldAll: mat[bw_Real] := Evaluate[list2 /. x -> bw]; Evaluation of mat[bw] for any value is then reasonably fast (or at least faster than building the table anew each time).