Re: an even faster way to normalize a
- To: mathgroup at smc.vnet.net
- Subject: [mg85683] Re: an even faster way to normalize a
- From: MattAd <adereth at gmail.com>
- Date: Tue, 19 Feb 2008 01:57:34 -0500 (EST)
- References: <fp9945$199$1@smc.vnet.net>
On Feb 17, 7:25 am, congruentialumina... at yahoo.com wrote:
> Hello UG:
>
> I have a 512x512 array of 3-tuples. I want to make any tuple with a
> value outside of 0 <--> 1, become {0.,0.,0.}.
>
> The first version has this loop:
>
> For[i = 1, i <= graphSize, i++,
> For[j = 1, j <= graphSize, j++,
> If[((sum[[i, j, 1]] < 0) || (sum[[i, j, 1]] > 1) ||
> (sum[[i, j, 2]] < 0) || (sum[[i, j, 2]] > 1) ||
> (sum[[i, j, 3]] < 0) || (sum[[i, j, 3]] > 1)),
> sum[[i, j]] = {0., 0., 0.}
> ]
> ]
> ];
>
> After scratching my head for a while I came up with this (equivalent)
> Map statement.
>
> sum = Map[
> If[#[[1]] < 0 || #[[1]] > 1 || #[[2]] < 0 || #[[2]] > 1 || #[[3]] <
> 0 || #[[3]] > 1, {0., 0., 0.}, #] &, sum, {2}];
>
> It is faster but only by about 15%.
>
> It is unreasonable to believe some other construction can accomplish
> this with a bigger payoff?
>
> Thanks in advance.
>
> Regards..Roger W.
This is faster than your approach by about 33%:
sum = Map[If[
(0 < #[[1]] < 1) &&
(0 < #[[2]] < 1) &&
(0 < #[[3]] < 1),
#, {0., 0., 0.}] &,
sum, {2}];
... since we are now only deferencing each element of the tuple once
instead of twice.
-Matt