MathGroup Archive 2008

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

Search the Archive

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[#[[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.
>  
>
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[#[[1]] < 0 || #[[1]] > 1 || #[[2]] < 0 || #[[2]] > 1 || 
#[[3]] < 0 || #[[3]] > 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