【问题标题】:Matlab save sequence of mat files from convertTDMS stored in cell array to sequence of mat filesMatlab将mat文件序列从存储在单元阵列中的convertTDMS保存到mat文件序列
【发布时间】:2014-10-13 05:35:56
【问题描述】:

我有以 .tdms 格式存储的数据,收集了许多传感器的数据,每天每秒测量一次。每天都会创建一个新的 tdms 文件,并每月存储在一个文件夹中。使用the convertTDMS function,我已将这些 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} 中的元胞(我的补充)
  • struct 数组“ConvertedData”(所有数据对象的结构 - convertTDMS 的一部分)
  • 到下面称为“数据”的结构数组(convertTDMS)
  • 到下面称为“MeasuredData”(convertTDMS)的结构数组 -> 在这个级别,我可以访问存储数据的通道。
  • 要最终访问/操作存储的值,我必须选择一个通道,例如(1,len) 和 then 通过结构数组获取实际值 (="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”开始,尝试传递(动态变化的)变量的名称等)中遇到了许多错误。

帮助我找到正确方向的类似问题包括Saving matlab files with a name having a variable inputDynamically Assign Variables in Matlabhttp://www.mathworks.com/matlabcentral/answers/4042-load-files-containing-part-of-a-string-in-the-file-name-and-the-load-that-file,但结果是在这种情况下我仍然没有比做体力活更近。

任何帮助将不胜感激。

【问题讨论】:

    标签: matlab load save


    【解决方案1】:

    如果我正确理解了您的最终目标,我认为您已经完成了。我认为您正在尝试处理您的 .mat 文件,并且将所有文件加载到单元阵列中不是必需的,而只是您解决方案的一部分?假设是这种情况,您可以从一个文件中加载数据,处理它,保存它,然后重复。这样,您一次只能加载一个文件,并且不应该达到任何限制。

    编辑

    您当然可以从您的代码中创建一个函数,然后在循环中调用它,传入文件名进行修改。就我个人而言,我可能会这样做,因为我认为这是更整洁的解决方案。如果您不想这样做,您可以将w{k,1} 替换为w,然后每次加载文件时w 都会被覆盖。如果您想明确清除变量,您可以使用带有空格分隔的变量列表的 clear 命令,例如clear w len pos,不过我觉得没必要。

    【讨论】:

    • 谢谢,是的。我的问题是,当我为 1 个文件运行 load-convert-save m-file 时,我不能在 for 循环中使用此解决方案。在独立的 m 文件中,我可以清除所有临时工作区变量,以便最终保存 mat 文件的(现在已修改的)内容。但是,这在循环中并不容易完成,因为我不知道是否可以在循环中重新初始化 everything。会从我的独立 m 文件帮助中创建一个函数(以便我可以循环它)吗?
    猜你喜欢
    • 1970-01-01
    • 2015-04-13
    • 2017-04-12
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2015-12-19
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多