Mathematica 9 is now available
Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2004
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2004

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

Search the Archive

Re: Is a For loop always a no-no?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg50323] Re: [mg50312] Is a For loop always a no-no?
  • From: "Wolf, Hartmut" <Hartmut.Wolf at t-systems.com>
  • Date: Fri, 27 Aug 2004 02:57:45 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

>-----Original Message-----
>From: 1.156 [mailto:rob at pio-vere.com]
To: mathgroup at smc.vnet.net
>Sent: Thursday, August 26, 2004 12:51 PM
>To: mathgroup at smc.vnet.net
>Subject: [mg50323] [mg50312] Is a For loop always a no-no?
>
>
>I realize that many times some form of Mathematica built in 
>array function will
>do the needed job.  Here I have a matrix containing individual data
>traces in rows y[[i]]. I want to make matrix containing the 
>corresponding
>derivative signals in rows yd[[i]].  I get this done using the 
>following
>For loop. Matrix yd has been initialized (it wouldn't work 
>with out it).
>
>For[i = 1, i < n, i++, yd[[i]] = Drop[RotateLeft[y[[i]]] - 
>y[[i]], -1]];
>
>I tried the obvious (to me):
>yd = Drop[RotateLeft[y] -y, -1];
>
>But I get garbage.  It seems the whole matrix has been flattened to a
>single list and the whole list is rotated --instead of doing it row
>by row as I need.
>
>Wizzards all: is there some slick way to do this without the For loop?
>If so, it's probably faster and sure would look better in the code.
>Suggestions appreciated as usual.
>
>Rob
>
>

Rob,

it's always good to make up an (even trivial) example:

In[1]:= y = Partition[Range[15]^2, 3]
Out[1]=
{{1, 4, 9}, {16, 25, 36}, {49, 64, 81}, {100, 121, 144}, {169, 196, 225}}

Our data. We have n sets:

In[2]:= n = Length[y]
Out[2]= 5

Initializing:

In[3]:= yd = PadLeft[{}, n, 0]
Out[3]= {0, 0, 0, 0, 0}

Your program delivers:

In[4]:=
For[i = 1, i < n + 1, i++, yd[[i]] = Drop[RotateLeft[y[[i]]] - y[[i]], -1]]
In[5]:= yd
Out[5]= 
{{3, 5}, {9, 11}, {15, 17}, {21, 23}, {27, 29}}


This does the same ("obviously") :

In[6]:= Drop[RotateLeft[#] - #, -1] & /@ y
Out[6]=
{{3, 5}, {9, 11}, {15, 17}, {21, 23}, {27, 29}}


This, perhaps, is slick:

In[7]:= ListConvolve[{{1, -1}}, y]
Out[7]=
{{3, 5}, {9, 11}, {15, 17}, {21, 23}, {27, 29}}


As to your heading, certainly not!

--
Hartmut


  • Prev by Date: Re: Is a For loop always a no-no?
  • Next by Date: Looking for a "smart" index for a Do-loop (Revised!)
  • Previous by thread: Re: Is a For loop always a no-no?
  • Next by thread: Opposite of ReadList[ ... ,Byte]?