2013-11-21 36 views
0

我试图导入多个数据文件,称为1min1,1min2,1min3,1min4等。他们将进行一些处理(减去某些列,乘以某些值等)和最终结果文件是一列。我希望matlab将每个这些列保存在一个与文件名相同的变量中。 因此,在进行多个文件1min1,1min2,1min3,1min4等时,出现几个同名的变量,但只有一个列/变量。基于文件名的变量

我尝试使用此:

i=20; %nr of files 
name='1min'; %basic filename 
norm=8;  %normalisation factor 

for k=1:i 
    fileName = strcat(name,num2str(k)); 
    A= load(fileName); 
    [thisshouldbethesamefilename]=(A(:,7)-A(:,6))/A(1,12)*norm; 
end 

最后,我想使这个功能,我只输入文件名,文件和归一化因子的NR,和它给了我所得到的列作为单独的变量。我知道我可以将所有列放在同一个文件中(例如使用B(:,1),B(:,2)等),但我想看到原始文件名,所以我知道数据的来源。 我试过genvarname,eval和类似的东西,但没有成功的几件事情。可能是简单的东西,帮助表示赞赏!

+0

可能我不明白为什么你不能做到这一点与'eval',但是你为什么要_want_?改为使用单元格数组,并存储文件名以供参考。可能使用'containers.Map'类,如果你想花哨,并允许查找基于文件名。 – chappjc

+0

我同意,它应该是可能与eval,该功能总是困惑了我很多,我似乎从来没有能够得到它的工作:\ 至于为什么我想要它,如果我使用单元格数组并存储文件名字作为参考,我仍然必须查找这些东西。 (这是懒惰的,还是不切实际的?)如果我知道我必须绘制1min5度量的数据,我只想使用变量1min5 :) – SvB

回答

2

使用eval应该可以正常工作。试试这个:

temp =(A(:,7)-A(:,6))/A(1,12)*norm; 
eval([ 'file_' name ' = temp;']) 

请注意,这将在所有变量名前面加上“file_”。这对你的任务很重要,因为你的文件名以一个数字开头(“1min”),它不会被识别为有效的MATLAB变量。换句话说,如果你刚刚写了

1min = 12 

... MATLAB会抛出一个错误。

+0

我很惊讶这里的响应时间。谢谢,这似乎已经做到了。将来,我会记住不要在开始时输入数字! – SvB

+1

这个解决方案是完全正确的,但有一些很好的理由可以避免评估。 (http://www.mathworks.de/de/help/matlab/matlab_prog/string-evaluation.html) – Daniel

1

我建议使用map container

i=20; %nr of files 
name='1min'; %basic filename 
norm=8;  %normalisation factor 
map = containers.Map() 
for k=1:i 
    fileName = strcat(name,num2str(k)); 
    A= load(fileName); 
    map(fileName)=(A(:,7)-A(:,6))/A(1,12)*norm; 
end 

读取数据通过

map(fileName) 
+1

优秀的建议。 ;) – chappjc

+1

请注意,您可以使用'map.keys'从地图中获取完整的文件名列表。 – chappjc

+0

从来没有听说过地图容器,但它看起来不错!谢谢你。 – SvB