"-Indexed" for MapAt?
- To: MathGroup at yoda.physics.unc.edu
- Subject: "-Indexed" for MapAt?
- From: Robby Villegas <Villegas at knox.bitnet>
- Date: Wednesday, Nov. 6, 1991
In version 2, MapIndexed is a useful generalization of Map, but there appears to be a gap in Mathematica: where's the generalization of MapAt, say "MapAtIndexed"? It would be useful to be able target an _unrestricted_ set of parts of an expression with a function taking (part, partspec), instead of just the special subsets comprising the _levels_ of an expression. I have devised a function which I think works correctly, but I'm not satisfied with it for reasons of efficiency. This function takes a list of part-specifications and uses MapIndexed with a level-specification and an appropriate setting of the Heads option to make sure that all the listed parts will be encompassed by the MapIndexed operation. The trouble, of course, is that there is a great deal of wasted operating as a lot of elements covered by the level-specification but not desired as targets, must be tested and then left untouched. Please suggest a more efficient method of implementing a part-selective rather than level-selective MapIndexed. Here is the one I currently have: MapAtIndexed[f_, expr_, partspecs_List] := Module[{levels = Map[Length, partspecs], minlevel, maxlevel, fselect}, minlevel = Min[levels]; maxlevel = Max[levels]; headsQ = MemberQ[Flatten[partspecs], 0]; fselect[part_, coords_] := If[MemberQ[partspecs, coords], f[part, coords], (* else skip: *) part]; MapIndexed[fselect, expr, {minlevel, maxlevel}, Heads->headsQ] ] Thank you, Robby Villegas Knox College E-mail: Villegas at Knox.Bitnet