Re: Elegant syntax for multiple conditional assignment?
- To: mathgroup at smc.vnet.net
- Subject: [mg54444] Re: Elegant syntax for multiple conditional assignment?
- From: Peter Pein <petsie at arcor.de>
- Date: Sun, 20 Feb 2005 00:10:39 -0500 (EST)
- References: <cv6q9a$65c$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Scott Hemphill wrote:
> Dear Mathematica aficionados:
>
> I have several state variables, each of which is a vector of "n" elements.
> I would like to assign each element in each vector based on a condition
> which is in the corresponding position in a condition vector. To be more
> specific:
>
> Each of a, c, x and y is a List of Length n.
> cond is a List of Length n, containing True and False values
>
> What I have is
>
> old = {a, c, x, y};
>
> code which changes a, c, x, and y
>
> new = {a, c, x, y};
>
> What I want to do is assign to each element of a, c, x and y the old value
> of a, c, x or y if the corresponding element of cond is False, and the new
> value of a, c, x or y if the corresponding element of cond is True.
>
> I've got a method that works:
>
> t=Transpose;
> {a, c, x, y} = t[If[#[[1]],#[[2]],#[[3]]]& /@ t[{cond,t[new],t[old]}]];
>
> All the transpositions and array indexing make me wonder if there's a more
> elegant way of expressing this.
>
> Any takers? Thanks in advance.
>
> Scott
Something like the following?
In[1]:=
n=5;
old=Table[10i+j,{i,4},{j,n}];
new=-old;
cond=Table[Random[]>.5,{n}]
Out[4]=
{True,False,True,True,True}
In[5]:=
If[Or@@cond,
ReplacePart[old,new,#,#]&@Position[Table[cond,{4}],True],
old]
Out[5]=
{{-11,12,-13,-14,-15},
{-21,22,-23,-24,-25},
{-31,32,-33,-34,-35},
{-41,42,-43,-44,-45}}
--
Peter Pein
Berlin