Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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.

share|improve this question
1  
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[1] = ...; A[2] = ...; 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. –  Leonid Shifrin Mar 6 '13 at 16:47
    
OK, soz, didn't search properly. Thanks for the links! –  Simon Righley 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
1  
@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. –  Leonid Shifrin Mar 6 '13 at 16:57
add comment

1 Answer

up vote 1 down vote accepted

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} = %;

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.