Mathematica中的动态变量命名

时间:2014-08-26 15:25:23

标签: wolfram-mathematica

我已经环顾了一会儿,似乎没有找到一个优雅的'解决我的问题,希望有人可以提供一些帮助。

非常简单地说,我的问题是:我希望能够命名多个变量,只有不同的指数'数。然而,这些数字并不是连续的。

粗略地说,我正尝试尝试以下内容:

fileNumbers={332,333,337,345,346};
int i=0;
Do{
i = current_list_item;
fileNumRi = Import[...];
slopeRi = fileNumR[[2]];
... etc ...
}While(inside the list)

然后我会以变量fileNumR332,fileNumR333等结束......

目前我的唯一解决方案是大量复制粘贴,但这变得非常乏味,并且通过拼写错误产生了太多机会。

非常感谢任何建议!

罗南

3 个答案:

答案 0 :(得分:1)

标准解决方案是使用变量fileNumR[1], fileNumR[2], fileNumR[3]...,如下所示:

Do[
  (
     fileNumR[i]=Import[...];
     slopeR[i] = fileNumR[i][[2]];
  ), {i, fileNumbers}];

(由于您似乎不确定Mathematica的语法,我想建议this collection of useful links。)

答案 1 :(得分:0)

另一种可能的首选方法是使用列表。相当于'Do'循环就像这样:

 fileNumbers = {332, 333, 337, 345, 346};
 listofcontents=Import["basename" <> ToString[#] <> ".dat"] & /@ fileNumbers;

然后使用Part表示法引用您的个人数据集,例如:

 listofcontents[[1,2]]

这里的缺点是索引是顺序{1,2,3,4,5},你需要直接使用你需要的原始文件编号:

 MapIndexed[ (fn[#] = First@#2) & , fileNumbers];
 listofcontents[[fn[332],2]]

在大多数情况下,使用列表进行编码的效率会超过那些繁琐的符号。

为了完整起见,您的文字问题的答案是使用ToExpression,例如:

 data = Import[...];
 ToExpression[ "filenum" <> ToString[i] <> " = data "]

你最终会得到一个名为filenum332等的符号。这种令人费解的工作方式很少能做到这一点。

答案 2 :(得分:0)

首先制作一些测试数据

fileNumbers = {332, 333, 337, 345, 346};

Export[ToString[#], {{1, 2, 3}, {"slopedata", #}}, "CSV"] & /@ fileNumbers

方法1:使用函数变量(如nikie的解决方案)

Map[(fileNumR[#] = Import[ToString[#]];
    slopeR[#] = fileNumR[#][[2]]) &, fileNumbers];

E.g。检查一个变量的输出

slopeR[337]
  

{slopedata,337}

方法2:创建最初由OP

指定的变量
Map[(Evaluate[Symbol[StringJoin["fileNumR", ToString[#]]]] = Import[ToString[#]];
    Evaluate[Symbol[StringJoin["slopeR", ToString[#]]]] =
     Symbol[StringJoin["fileNumR", ToString[#]]][[2]]) &, fileNumbers];

再次检查一个变量的输出

slopeR337
  

{slopedata,337}

要在同一会话中重复该过程,需要事先清除变量。

Map[(Clear @@ Names[StringJoin["fileNumR", ToString[#]]];
    Evaluate[Symbol[StringJoin["fileNumR", ToString[#]]]] = Import[ToString[#]];
    Clear @@ Names[StringJoin["slopeR", ToString[#]]];
    Evaluate[Symbol[StringJoin["slopeR", ToString[#]]]] =
     Symbol[StringJoin["fileNumR", ToString[#]]][[2]]) &, fileNumbers];

最后,如果您有任何机会需要将fileNumR337转换为fileNumR[337],请参阅此帖子: - https://mathematica.stackexchange.com/a/38767/363