4

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.

cormullion
  • 24,243
  • 4
  • 64
  • 133

1 Answers1

2

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

m_goldberg
  • 107,779
  • 16
  • 103
  • 257