我以.tdms格式存储数据,收集每天每秒测量的许多传感器的数据。每天都会创建一个新的tdms文件,并每月存储在一个文件夹中。使用convertTDMS函数,我已将这些tdms文件转换为mat文件。
由于某些测量中存在一些错误(例如,物理上不可能出现的负值),我通过一次加载一个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。
" w"中的每个单元都有从tdms到mat转换存储的所有数据,格式为convertTDMS描述中所述。
这意味着:要获取实际数据,我需要从
单元格数组w {k,1}中的单元格(我的加法)
到结构数组" ConvertedData"(所有数据对象的结构-convertTDMS的一部分)
到下面称为"数据"的结构数组(convertTDMS)
在此级别上,将其移到下面称为" MeasuredData"(convertTDMS)->的结构数组中,即可访问存储数据的通道。
为了最终访问/操作存储的值,我必须选择一个通道,例如(1,len),然后通过struct数组获得实际值(=" Data")。 (转换TDMS)
在Matlab格式中,它看起来像" w {1,1} .ConvertedData.Data.MeasuredData(1,len).Data(1:end)"或" w {1,1} .ConvertedData.Data.MeasuredData(1, len).Data"。
为了简化打字,我采取了
x = 'ConvertedData';
y = 'Data';
z = 'MeasuredData';
请允许我写:
w{k,1}.(x).(y).(z)(1,len).(y)
使用点符号。
我的目标/问题:我想将存储在.mat文件中的值从循环中的原始.tdms文件加载到单元格数组中(或者如果我做得比单元格数组更好:请告诉我),请执行必要的操作计算,然后使用原始名称保存每个"更正"的.mat文件。
到目前为止,尝试各种解决方案,从" getfieldnames"到试图传递(动态变化的)变量的名称等,已经出现了许多错误。
帮助我朝正确方向发展的类似问题包括使用名称具有变量输入的名称保存Matlab文件,在Matlab中动态分配变量以及包含http://www.mathworks.com/matlabcentral/answers/4042-load-files-文件名中的字符串的一部分和该文件的负载,但是结果是在这种情况下,我仍然比做体力劳动更近。
任何帮助,将不胜感激。
如果我正确理解了您的最终目标,我认为您就在那里。 我认为您正在尝试处理.mat文件,并且不需要将所有文件加载到单元阵列中,而只是解决方案的一部分? 假设是这种情况,您可以只从一个文件中加载数据,进行处理,保存然后重复。 这样,您一次只能加载一个文件,并且不会达到任何限制。
编辑
您当然可以用代码创建一个函数,然后循环调用该函数,并传入文件名进行修改。 我个人可能会这样做,因为我认为这是更整洁的解决方案。 但是,如果您不想这样做,可以将w{k,1}替换为w,那么每次加载文件w时都会被覆盖。 如果您想显式清除变量,则可以使用clear命令以及以空格分隔的变量列表,例如 clear w len pos,但我认为这不是必需的。
谢谢,是的。 我的问题是,当我为1个文件运行load-convert-save m文件时,然后无法在for循环中使用此解决方案。 在独立的m文件中,我可以清除所有临时工作区变量,因此最终将保存Mat文件的内容(已修改)。 但是,这并不是那么容易在循环中完成,因为我不知道是否可以重新初始化循环中的所有内容。 是否可以通过独立的m文件来提供功能(以便我可以循环使用它)?