我有以.tdms格式存储的数据,每天收集许多传感器的数据,每秒测量一次。每天都会创建一个新的tdms文件,并且每月存储在一个文件夹中。使用the convertTDMS function,我已将这些tdms文件转换为mat文件。
由于某些测量中存在一些错误(例如,无法实际发生的负值),我通过一次加载一个mat文件进行了一些修正,进行计算然后将数据保存到原始文件中。垫文件。
然而,当我尝试在循环中执行上面描述的操作时(所以:在文件夹中加载.mat,在一个mat文件(或其中的通道)上进行计算,保存mat文件,重复直到文件夹中的所有文件都有已完成),我最终遇到了保存功能的限制:到目前为止,我在使用下面的代码时保存了工作区中的所有变量(或无法保存)。
for k = 1:nFiles
w{k,1} = load(wMAT{k,1});
len = length(w{k,1}.(x).(y).(z));
pos = find(w{k,1}.(x).(y).(z)(1,len).(y)<0); %Wind speed must be >0 m/s
for n = 1:length(pos)
w{k,1}.(x).(y).(z)(1,len).(y)(pos(n)) = mean([w{k,1}.(x).(y).(z)(1,len).(y)(pos(n)+1),...
w{k,1}.(x).(y).(z)(1,len).(y)(pos(n)-1)],2);
end
save( name{k,1});
%save(wMAT{k,1},w{k,1}.(x),w{k,1}.ConvertVer,w{k,1}.ChanNames);
end
一些背景信息:文件名存储在文件夹中长度为nFiles的单元格数组wMAT中。单元阵列wMAT中的每个单元存储mat文件的完整文件路径。 加载文件数据并将其保存到单元阵列w中,长度为nFiles。 每个细胞都在&#34; w&#34;将所有数据存储在tdms到mat转换中,格式为convertTDMS描述中描述的格式。 这意味着:要获得实际数据,我需要从
开始为了让打字更容易,我拿了
x = 'ConvertedData';
y = 'Data';
z = 'MeasuredData';
允许我改写:
w{k,1}.(x).(y).(z)(1,len).(y)
使用点符号。
我的目标/问题:我想将存储在.mat文件中的值从循环中的原始.tdms文件加载到单元格数组中(或者如果我可以做得比单元格更好数组:请告诉我),做必要的计算,然后保存每个更正的&#39; .mat文件使用原始名称。
到目前为止,我从尝试各种解决方案中获得了大量错误,从#34; getfieldnames&#34;,尝试传递(动态变化的)变量的名称等。< / p>
有助于我朝着正确方向前进的类似问题包括Saving matlab files with a name having a variable input,Dynamically Assign Variables in Matlab和http://www.mathworks.com/matlabcentral/answers/4042-load-files-containing-part-of-a-string-in-the-file-name-and-the-load-that-file,但结果是我仍然没有比在这种情况下做手工劳动更接近。
任何帮助都将不胜感激。
答案 0 :(得分:0)
如果我正确地理解了你的最终目标,我认为你几乎就在那里。我认为您正在尝试处理.mat文件,并且不是要求将所有文件加载到单元格数组中,而只是解决方案的一部分?假设是这种情况,您可以只从一个文件加载数据,处理它,保存它然后重复。这样,您一次只能加载一个文件,不应达到任何限制。
修改强>
您当然可以从代码中创建一个函数,然后在循环中调用它,传入文件名进行修改。就个人而言,我可能会这样做,因为我认为这是更简洁的解决方案。如果您不想这样做,则可以将w{k,1}
替换为w
,然后每次加载文件w
时都会被覆盖。如果要显式清除变量,可以使用clear
命令和空格分隔的变量列表,例如clear w len pos
,但我不认为这是必要的。