Re: problem with append
- To: mathgroup at smc.vnet.net
- Subject: [mg129534] Re: problem with append
- From: Murray Eisenberg <murray at math.umass.edu>
- Date: Mon, 21 Jan 2013 00:08:22 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
- References: <20130120062148.0CB436854@smc.vnet.net>
Paolo,
Welcome to Mathematica!
You made two basic errors in your code:
(1) At each pass through the inner loop, rr gets reset to the empty list; you should initialize rr before the loop.
(2) The correct function name is AppendTo ("camel-case").
So you could correct your code to:
rr = {};
For[a = 2, a < 6, a++, For[b = 2, b < 6, b++, AppendTo[rr, a^b]]]
rr
I suspect you came to Mathematica after using a procedural programming language where you had little choice but to spell out in detail such iterations. In Mathematica, however, there are _much_ easier ways to construct to kind of list you want.
Flatten[Outer[Power, Range[2, 5], Range[2, 5]]]
Explanation: Range[2, 5] gives {2, 3, 4, 5}.
Outer applies its 1st argument, here Power, to each element of its 2nd argument ( Range[2, 5]) paired with each element of its 3rd argument (also Range[2, 5] ).
The result of that is the nested list:
{{4, 8, 16, 32}, {9, 27, 81, 243}, {16, 64, 256, 1024}, {25, 125, 625, 3125}}
Flatten of that unseats that, giving just a plain 1-level list.
One might call the method with Outer a "functional" approach.
Another way that more directly exposes the iteration involved is by using Table:
Flatten[Table[a^b, {a, 2, 5}, {b, 2, 5}]]
WAlthough the numbers in your example are modest in size, and efficiency should not be at the top of your concerns as a Mathematica beginner, still it's illuminating to compare the efficiency of your original, explicitly iterative For loop as compared with the functional and Table approaches. For that, I changed the upper bound 5 to 1000.
rr = {};
Timing[For[a = 2, a < 1001, a++, For[b = 2, b < 1001, b++, AppendTo[rr, a^b]]];]
(* on my 3.4 GHz Core i7 iMac with 16GB RAM, this was still running after 10 minutes! *)
Timing[Outer[Power, Range[2, 1000], Range[2, 1000]];]
{3.368449, Null}
Timing[Flatten[Table[a^b, {a, 2, 1000}, {b, 2, 1000}]];]
{3.527593, Null}
Slight advantage to the functional approach over Table. The For loop method is out of the question!
On Jan 20, 2013, at 1:21 AM, Paolo cachecho <paolocach at gmail.com> wrote:
> hello i am new to mathmatica.i have the following problem if anyone could help.
>
> For[a = 2, a < 6, a++,
> For[b = 2, b < 6, b++,
> Appendto[rr = {}, a^b]]]
> rr
>
> but rr remains empty. how can i solve this
> thank you
---
Murray Eisenberg murray at math.umass.edu
Mathematics & Statistics Dept.
Lederle Graduate Research Tower phone 413 549-1020 (H)
University of Massachusetts 413 545-2838 (W)
710 North Pleasant Street fax 413 545-1801
Amherst, MA 01003-9305
- References:
- problem with append
- From: Paolo cachecho <paolocach@gmail.com>
- problem with append