Re: Is a For loop always a no-no?
- To: mathgroup at smc.vnet.net
- Subject: [mg50335] Re: [mg50312] Is a For loop always a no-no?
- From: "David Annetts" <davidannetts at ihug.com.au>
- Date: Fri, 27 Aug 2004 02:57:58 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi Rob, 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. ------------------- For (& Do, While, etc) loops have the advantage that they are usually immediately understandable at a glance. Translating C++ or Fortran into Mathematica is usually straightforward if a For (or Do for the Fortran buffs:) is used. Mathematica's functional shorthand usually takes a bit more thought, but its advantage (usually) is speed. Try defining the function der[x_List] := Drop[RotateLeft[x] - x, -1] This is applied to your matrix using Map[der, y] Having said that, I get little speed difference between the functional approach and the For loop IN THIS CASE. I suspect this is because of the RotateLeft function. In this case, the advantage of the functional approach is that I don't need to worry about defining "n"; I can just do it. Regards, Dave.