Variable name string to expression

I'm not sure how to name this problem appropriately. But anyway.

I have, say, three variables (arrays in my case), which I call:

A1, A2, A3

I would like to perform a certain operation on all of these arrays. Obviously I don't want to duplicate the code. What I figured is the following:

For[id = 1, id <= 3,
INPUT = ToExpression["A" <> ToString[id]];
INPUT = Table[{INPUT[[j, 1]], 10^4*INPUT[[j, 2]]}, {j, 1, Length[INPUT]}];
id += 1;
];

This unfortunately does NOT work.

It's just an example. But the big question is how to handle names of variables in "such" cases? Any help greatly appreciated.

• Duplicates: Constructing variable names from a string, Assigning values to a list of variable names, Variable variable names and related linked questions (several more). The best solution is to not construct variables like this, but instead use downvalues — i.e. A = ...; A = ...; etc.
– rm -rf
Mar 6 '13 at 16:40
• @rm-rf Looks like we need one canonical answer to bind them all. All those look at some aspects of this problem, but I can't say that any of them are exact duplicates of this one. Mar 6 '13 at 16:47
• OK, soz, didn't search properly. Thanks for the links! Mar 6 '13 at 16:50
• @LeonidShifrin Perhaps this might be a good place for it (even though it's not exactly a "pitfall")
– rm -rf
Mar 6 '13 at 16:52
• @rm-rf Not sure about that. It is probably the best place for it that we currently have, but I would prefer a dedicated question sounding something like "best practices in making assignments and using variables in Mathematica". There are actually two separate problems mixed in this and other similar questions: using (or not) string names, and making automated assignments to a bunch of variables. Both could be covered in that canonical question / answer. Mar 6 '13 at 16:57

Here is one approach to solving your problem. I do not consider the part of your problem that asks how to generate a list of varialbe names, as that is well covered in links to previous questions already provided in comments made to your question.

Define a function that will perfom your operation on one matrix.

myOperation[m : {{_, _} ..}] :=
ReplacePart[m, {i_, 2} :> 10^4 m[[i, 2]]]

To apply the operation to the matrices, use Map.

Map[myOperation, {a, b, c}]

This can also be written

myOperation[#] & /@ {a, b, c}

Testing

To test this solution to problem, make some data.

make[] := RandomInteger[20, {4, 2}]
{a, b, c} = {make[], make[], make[]};

{{{6, 11}, {9, 16}, {13, 4}, {5, 13}},
{{17, 14}, {11, 12}, {4, 3}, {12, 0}},
{{19, 0}, {11, 5}, {11, 20}, {1, 1}}}

First test is to try myOperation with one matrix.

myOperation[a]

{{6, 110000}, {9, 160000}, {13, 40000}, {5, 130000}}

Second test is to try it with all three.

Map[myOperation, {a, b, c}]

{{{6, 110000}, {9, 160000}, {13, 40000}, {5, 130000}},
{{17, 140000}, {11, 120000}, {4, 30000}, {12, 0}},
{{19, 0}, {11, 50000}, {11, 200000}, {1, 10000}}}

If you want the orginal variables to have the new values, you can do

{a, b, c} = %;