       Re: [functional approach should give] an even faster way

• To: mathgroup at smc.vnet.net
• Subject: [mg85682] Re: [mg85648] [functional approach should give] an even faster way
• From: Carl Woll <carlw at wolfram.com>
• Date: Tue, 19 Feb 2008 01:57:03 -0500 (EST)
• References: <200802171220.HAA01093@smc.vnet.net>

```congruentialuminaire 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[#[] < 0 || #[] > 1 || #[] < 0 || #[] > 1 || #[] <
>        0 || #[] > 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?
>
>
>Regards..Roger W.
>
>
Here is one possibilitiy:

normalize[matrix_] := matrix N@UnitStep@Total[Clip[matrix, {0, 1}, {-10,
-10}], {3}]

Timings:

matrix = RandomReal[{-.1,1.1}, {512,512,3}];

r1 = Map[If[#[] < 0 || #[] > 1 || #[] < 0 || #[] > 1 ||
#[] < 0 || #[] > 1, {0., 0., 0.}, #] &,
matrix, {2}]; // Timing
r2 = normalize[matrix]; // Timing
r1 == r2

{0.703,Null}

{0.078,Null}

True

Almost an order of magnitude faster.

Carl Woll
Wolfram Research

```

• Prev by Date: Re: [functional approach should give] an even faster way
• Next by Date: Re: an even faster way to normalize a
• Previous by thread: [functional approach should give] an even faster way to normalize a
• Next by thread: StyleSheets How-to