MathGroup Archive 2012

[Date Index] [Thread Index] [Author Index]

Search the Archive

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).



  • Prev by Date: Re: Fit data
  • Next by Date: Re: Compile function and AppendTo for lists (vrs.
  • Previous by thread: Re: Fit data
  • Next by thread: Re: large lists with variable and if condition (vrs. 8.0.4)