Search All of the Math Forum:

Views expressed in these public forums are not endorsed by NCTM or The Math Forum.

Notice: We are no longer accepting new posts, but the forums will continue to be readable.

Topic: List Replace Problems
Replies: 8   Last Post: Aug 30, 2005 4:44 AM

 Messages: [ Previous | Next ]
 wes Posts: 24 Registered: 12/13/04
Re: List Replace Problems
Posted: Aug 28, 2005 11:29 PM

Original Message:

>I want to perform some element by element operations on a class of
>lists. For a given list The operation in a much simplified form can be
>characterized by
>
>a = {1, 3, 5, 7, 9};
>Do[a[[i]] /= i, {i, 1, 5}];
>a
>
>Out[38]=
>{1, 3/2, 5/3, 7/4, 9/5}
>
>Now, however, if I try to define a function to do this for a general
>list, namely,
>
>dlst[u_List] =
> Do[u[[i]] /= i, {i, 1, 5}];
>a = {1, 3, 5, 7, 9};
>dlst[a];
>a
>
>Set::setps:
>({1, 2, 3, 4, 5}) in assignment of part is not a symbol. ! More ...
>
>Out[39]=
>{1, 3, 5, 7, 9}
>
>I get the above error. It says I'm trying to assign one number to
>another number. Why does Mathematica perform in the first case but
>refuse to in the second.
>
>I tried
>
>b = Do[ReplacePart[a, a[[i]]/i, i], {i, 1, 5}]
>
>but it doesn't even bother to return an error message.
>
>
>How, can I get the desired function?
>
>Thanks,
>
>Wesh

----------------------------------------------------------

Thanks to all who replied.

For my problem there seem to be two easy answers. First using MapIndexed
(This is a little more complex than the original problem)

f[k_Integer, i_] := If[i != k, 1/(k^2 - i^2), 0];
lstIntegrate[lst_List, k_Integer] := MapIndexed[#1*f[k, #2[[1]]] & ,
lst];

Testing on a numeric list:
a = {1, 3, 5, 7, 9};
lstIntegrate[a, 2]
Out[1] = {1/3, 0, -1, -(7/12), -(3/7)}

Testing on a list of symbols:
b = {u, v, w, x, y, z};
lstIntegrate[b, 2]
b
Out[2]=
{u/3, 0, -(w/5), -(x/12), -(y/21), -(z/32)}
Out[3]=
{u, v, w, x, y, z}

The second approach is to form the factors in a separate list and then
multiply
that list times the the input list. This is only possible if factors
are only
dependent on the index and not on the content of the list position.

factorList = Table[f[2, i], {i, 1, 6}]
Out[4]=
{1/3, 0, -(1/5), -(1/12), (1/21), -(1/32)}

A timing measurement shows the factor list is far superior.

\$HistoryLength = 0;
Timing[Do[lstIntegrate[b, 2], {100000}]; ]
Out[24]=
{8.875*Second, Null}

Timing[Do[factorList*b, {100000}]; ]
Out[25]=
{0.875*Second, Null}

Unfortunately, there didn't seem to be a way to modify the input list in
place
to save memory. In the actual problem the list elements are large two
variable
polynomials and I was getting the kernel out of memory shutdown notice.

Date Subject Author
8/23/05 wes
8/24/05 Jens-Peer Kuska
8/24/05 David Bailey
8/28/05 wes
8/30/05 albert
8/24/05 Mike
8/24/05 dkr
8/24/05 Peter Pein
8/24/05 Jean-Marc Gulliet