Re: Strange Behaviour of ReplaceAll with Subscript (A bug or what?)
- To: mathgroup at smc.vnet.net
- Subject: [mg113334] Re: Strange Behaviour of ReplaceAll with Subscript (A bug or what?)
- From: Bill Rowe <readnews at sbcglobal.net>
- Date: Sun, 24 Oct 2010 06:04:45 -0400 (EDT)
On 10/23/10 at 7:06 AM, thomasgdowling at gmail.com (Thomas Dowling) wrote: >I have come across some strange behaviour with ReplaceAll when >creating subscripted variables, which I am not able to explain. >The Problem: >I have lists like the following: >list1 = Partition[Range[6], {3}] >list2 = Partition[Range[9], {3}] >I wish to convert to a list of indexed variables which I do as >follows: >replist={Subscript[a,x],Subscript[a,y],Subscript[a,z]}; >list1/.{x_,y_,z_}-> replist >This produces the expected output >{{Subscript[a, 1],Subscript[a, 2],Subscript[a, 3]},{Subscript[a, >4],Subscript[a, 5],Subscript[a, 6]}} >list3/.{x_,y_,z_}-> replist >However, **list2** produces the following >list2/.{x_,y_,z_}-> replist >{Subscript[a, {1,2,3}],Subscript[a, {4,5,6}],Subscript[a, {7,8,9}]} >Is this a bug or is such behaviour expected (and if so, what am I >missing?) No, it is not a bug. The problem is the pattern {x_,y_,z_} matches any list of three items. A 3 x 3 list of integers is a list of three lists each having 3 integers. So, the pattern matches the top level list. For any n x 3 array where n is not 3, the pattern can only match the sublists and will work as you expect. A solution is to make the pattern match more restrictive. For example, using the pattern {x_Integer,y_,z_} restricts the match to a list of three elements where the first is an integer. With this pattern In[20]:= list2 /. {x_Integer, y_, z_} -> replist Out[20]= {{Subscript[a, 1], Subscript[a, 2], Subscript[a, 3]}, {Subscript[a, 4], Subscript[a, 5], Subscript[a, 6]}, {Subscript[a, 7], Subscript[a, 8], Subscript[a, 9]}} The desired result is obtained. Another way to achieve the same result would be to use a level specification with Map. For example, In[21]:= Map[Subscript[a, #] &, list2, {2}] Out[21]= {{Subscript[a, 1], Subscript[a, 2], Subscript[a, 3]}, {Subscript[a, 4], Subscript[a, 5], Subscript[a, 6]}, {Subscript[a, 7], Subscript[a, 8], Subscript[a, 9]}} This solution will work for any m X n array and ragged arrays.