Re: A Mathematica implementation of SolvOpt
- To: mathgroup at smc.vnet.net
- Subject: [mg88621] Re: A Mathematica implementation of SolvOpt
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Sat, 10 May 2008 06:51:43 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <g00uq4$gi1$1@smc.vnet.net>
tommcd wrote:
[snip]
> For example I'd like a more efficient and elegant way to express
> Do[
> deltax[[j]] = If[ g0[[j]] >= 0.0, h1*ddx, -h1*ddx]
> , {j,n}
> ];
>
> which in Fortran 95 can be written very clearly as
>
> Where(g0 >= 0.0)
> g0 = h1*ddx
> ElseWhere
> g0 = -h1*ddx
> End Where
>
> where g0 can be any array of up to 7 dimensions, & any number of array
> assignments
> can appear in each section (not just the one shown here), moreover the
> 'Where' can itself
> be nested inside another where etc.. For now a construct which works
> for the 1D list above
> and avoids the do loop would be fine, though if there is a general
> method for masked array assignments in Mathematica I love to hear
> about it.
Tom,
You could use higher level built-in functions such as *Sign[]*,
*DiracDelta[]*, *UnitStep[]*, etc., functions that automatically thread
over lists and returned integer values in the range [-1, 1] (the actual
values depend on the function used) for each element of the lists.
Here is an example with *Sign[]*
g0 = {{{1, -2}, {3, -4, 5}}, {{6, -7, -8, -9}, 10}};
h1 = 12;
ddx = 1/2;
deltax = h1*ddx*Sign[g0]
{{{6, -6}, {6, -6, 6}}, {{6, -6, -6, -6}, 6}}
Regards,
-- Jean-Marc