在MATLAB中将数据保存到.mat文件

时间:2017-11-14 13:31:58

标签: matlab save

我是MATLAB的新手,我无法使我的功能正常工作,以便将我的数据保存到.mat文件中。

输入:

  • 一个结构,包含5个字段:

    • data:19x1000x143
    • 的3D矩阵
    • labels:1x143矩阵,其中包含1-1
    • subject_number:一个整数
    • sampling_rate:整数,500 Hz
    • channel_names:1x19矩阵,其中包含文字
  • name:文件名称的字符串

  • clean:包含10的矩阵1x143。

我们的想法是只保存干净矩阵中标记为1的干净数据。

 If clean(i) is equal to 1:
      save data(:,:,i) and labels(:,i)

这是我尝试在save.m文件中实现的代码:

function saving(EEG_struct, clean, name)

subject_number = EEG_struct.subject_number;
fs = EEG_struct.sampling_rate;
chan_names = EEG_struct.channel_names;
nb_epoch = size(EEG_struct.data, 3);

for j=1:nb_epoch
    if clean(j) == 1
        % Keep the epoch and label
        data = cat(3, data, EEG_struct.data(:,:,j));
        labels = cat(2, labels, EEG_struct.labels(:,j));
    end
end

save(name, data, labels, subject_number, fs, chan_names)

如您所见,我想将数据保存为与EEG_struct输入形状相同的结构。 此外,我想使用parfor而不是for,但它给我一个错误,我没有得到:

An UndefinedFunction error was thrown on the workers for 'data'.  This might be because the file containing 'data' is not accessible on the workers.  Use addAttachedFiles(pool, files) to specify the required files to be attached.  See the documentation for 'parallel.Pool/addAttachedFiles' for more details. Caused by: Undefined function or variable 'data'.

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以将clean变量用作逻辑索引,并立即解析数据和标签。所以不需要循环。

另外,save命令需要变量的“名称”来保存变量本身。所以我只是把''围绕着每一个。

function saving(EEG_struct, clean, name)

subject_number = EEG_struct.subject_number;
fs = EEG_struct.sampling_rate;
chan_names = EEG_struct.channel_names;
nb_epoch = size(EEG_struct.data, 3);

%No need for a loop at all
data  = EEG_struct.data(:,:,logical(clean));
labels = EEG_struct.labels(logical(clean));  %This is a 1xN so I removed the extra colon operator
save(name, 'data', 'labels', 'subject_number', 'fs', 'chan_names');

修改 如果您想要将所有内容留在结构中,请根据您的意见。我给了你两个如何保存它的选项。

function saving(EEG_struct, clean, name)
%Crop out ~clead data
EEG_struct.data  = EEG_struct.data(:,:,logical(clean));
EEG_struct.labels = EEG_struct.labels(logical(clean));  %This is a 1xN so I removed the extra colon operator
% Option 1
save(name, 'EEG_struct'); 
% Option2
save(name, '-struct', 'EEG_struct');

选项1 会直接将结构保存到MAT文件中。所以,如果你要像这样加载数据:

test = load(name);

test = 
        EEG_struct: [1x1 struct]

你会把你的结构放在另一个结构里......这可能不太理想,或者需要一条额外的线来去嵌套它。另一方面,只加载没有输出load(name)的MAT文件会将EEG_struct放入当前工作空间。但是如果在一个函数中,那么它就会在没有被声明的情况下生成,这会使代码更难以理解。

选项2 使用'-struct'选项将每个字段自动分解为MAT文件中的单独变量。所以像这样加载:

EEG_struct = load(name);

将所有字段重新组合在一起。对我来说,至少在一个函数中完成时看起来更干净,但可能只是我的偏好

因此,请注意您喜欢的内容。另外,我没有在保存中包含clean。您可以将其附加到MAT或将其添加到您的结构中。

答案 1 :(得分:1)

要获得与EEG_struct相同的结构,但只使用与clean变量对应的数据/标签,您只需复制现有结构并删除{{1 }}

clean=0