Re: What is happening here?
- To: mathgroup at smc.vnet.net
- Subject: [mg22166] Re: What is happening here?
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Thu, 17 Feb 2000 01:23:55 -0500 (EST)
- References: <888ad7$c7d@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Jordan, With vLarge = {1, 2}; authornames = {"PA", "HW"}; We get the contrast Through[Hold[f["PA"], f["HW"]][vLarge]](*1*) Hold[f["PA"][{1, 2}], f["HW"][{1, 2}]] Through[FullForm[Hold @@ (f /@ authornames)][vLarge]](*2*) Hold[f["PA"], f["HW"]][List[1, 2]] The difference arrises from the behaviour of the "wrapper" FullForm. The evaluation of (*2*) proceeds as follows Through[FullForm[Hold @@ (f /@ authornames)][vLarge]] Through[FullForm[Hold @@ (f /@ {"PA", "HW"})][vLarge]]; Through[FullForm[Hold @@ ({f["PA"], f["HW"]})][vLarge]] Through[FullForm[Hold[f["PA"], f["HW"]]][vLarge]] (*3*) FullForm[Hold[f["PA"], f["HW"]]][vLarge] FullForm[Hold[f["PA"], f["HW"]][{1, 2}]] Hold[f["PA"], f["HW"]][List[1, 2]] We can see the how the last expression displays FullForm[Hold[f["PA"], f["HW"]][{1, 2}]] Hold[f["PA"], f["HW"]][List[1, 2]] The crucial point is the presence of the FullForm in (*3*) when Through is evaluated. Some notes about wrappers: FullForm is a "wrapper" ($OutputForms gives the list of them) and whenever Wrapper[expr] is sent for display and for storing as a value of Out[n] for some n, then Wrapper[expr] is displayed but *expr* is stored as the value of Out[n], thus: % Hold[f["PA"], f["HW"]][{1, 2}] This stripping off of the wrappers only occrurs at this final stage and is only done then for wrappers that are not inside non-wrappers A[FullForm[a^2]] A[Power[a, 2]] % A[Power[a, 2]] These difficulties often crop up with MatrixForm -compare {{a}, {b}} + FullForm[{{c}, {d}}] {{a}, {b}} + MatrixForm[{{c}, {d}}] "Jordan Rosenthal" <jr at ece.gatech.edu> wrote in message news:888ad7$c7d at smc.vnet.net... > Hi all, > > I finally had a chance to try and compare all the different methods people > sent me for computing the matrix > > ( 1 0 0 ) > ( 2 1 0 ) > ( 3 2 1 ) > ( 0 3 2 ) > ( 0 0 3 ) > > from the vector {1,2,3} (using much larger vectors). I am running into a > strange problem that I can't explain. > > I started by creating a function for each contributer. Here is an example > for two of the defintions (picked arbitrarily for this example because they > were first and last in the alphabet): > > ------------------------------------------------------- > f["Paul Abbot"][v_?VectorQ] := Module[ > {n = Length[v]}, > NestList[RotateRight, > Reverse[PadRight[PadLeft[v, 2n - 1], 3n - 2]], 2n - 2][[All, > Range[2n - 1, 3n - 2]]] > ] > > f["Hartmut Wolf"][v_?VectorQ] := With[{r = Length[v] - 1}, > Transpose[NestList[RotateRight, Join[v, Table[0, {r}]], r]]] > ------------------------------------------------------- > > Running the following code (based on a suggestion from Hartmut Wolf) works > great: > > ------------------------------------------------------- > vLarge = Range[400]; > > List @@ (Part[#, 1, 1] &) /@ > Timing /@ Through[ Hold[f["Paul Abbot"], f["Hartmut Wolf"]][vLarge]] > > {0.49 Null, 0.27 Null} > ------------------------------------------------------- > > This works great; it gives me a list of timings for the two methods. But > because I have a large list I wanted to instead run code like this (where > authornames would be a larger vector): > > ------------------------------------------------------- > authornames = {"Paul Abbot", "Hartmut Wolf"}; > > List @@ (Part[#, 1, 1] &) /@ > Timing /@ Through[ FullForm[Hold @@ (f /@ authornames)][vLarge]] > > {0. Null} > ------------------------------------------------------- > > but this doesn't work the same way. So I tried to compare the difference > between the two versions by checking the difference between the code I > replaced and my code. Shown below, the two expressions have the same > FullForms and Attributes: > > ------------------------------------------------------- > expr1 = Hold[ f["Paul Abbot"], f["Hartmut Wolf"] ]; > expr2 = Hold @@ (f /@ authornames); > > FullForm[expr1]==FullForm[expr2] > True > > Attributes[expr1]==Attributes[expr2] > True > > expr1 == expr2 > True > ------------------------------------------------------- > > If the two expression have the same FullForm and Attributes, why do I not > get the same results if I substitute one for the other? > > > Humbly perplexed, > > Jordan > > > > >