在 MATLAB 中将数据保存到 .mat 文件
Posted
技术标签:
【中文标题】在 MATLAB 中将数据保存到 .mat 文件【英文标题】:Saving data to .mat file in MATLAB 【发布时间】:2017-11-14 13:31:57 【问题描述】:我是 MATLAB 新手,我无法让我的函数工作以将我的数据保存到 .mat
文件中。
输入:
一个结构,有 5 个字段:
data
:19x1000x143 的 3D 矩阵
labels
:1x143 矩阵,其中包含 1
或 -1
subject_number
:一个整数
sampling_rate
:整数,500Hz
channel_names
: 1x19 矩阵,其中包含文本
name
:文件名字符串
clean
:一个 1x143 的矩阵,其中包含 1
或 0
。
这个想法是只保存干净的数据,在干净的矩阵中标记为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'.
感谢您的帮助!
【问题讨论】:
【参考方案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');
编辑: 如果您只想将所有内容留在结构中,请根据您的评论。我给了你 2 个关于如何保存它的选项。
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]
您会将您的结构放置在另一个结构中......这可能不理想或需要额外的线来取消嵌套。另一方面,仅加载没有输出的 MAT 文件 load(name)
会将 EEG_struct
放入当前工作区。但是如果在一个函数中,那么它就会在没有被声明的情况下突然出现,这使得代码更难遵循。
选项 2 使用“-struct”选项自动将每个字段拆分为 MAT 文件中的单独变量。所以像这样加载:
EEG_struct = load(name);
将所有字段重新组合在一起。对我来说,至少在函数中完成这看起来更干净,但可能只是我的偏好
所以注释掉你喜欢哪个。另外,不是我没有在保存中包含clean
。您可以将其附加到 MAT 或将其添加到您的结构中。
【讨论】:
再次感谢,我们如何将其保存为结构?就像 EEG_struct 一样。 @Mathieu 查看我的编辑以使用各种选项保存结构。【参考方案2】:要获得与EEG_struct
相同但只有与clean
变量对应的数据/标签的结构,您可以简单地复制现有结构并删除clean=0
所在的行
function saving(EEG_struct, clean, name)
newstruct = EEG_struct;
newstruct.data(:,:,logical(~clean)) = '';
newstruct.labels(logical(~clean)) = '';
save(name,'newstruct');
【讨论】:
谢谢,假设 EEG_struct.data 是一个 19x1000x134 的矩阵,我的工作区中有一个矩阵 data_filtered,大小相同,为 19x1000x134。如何用过滤后的数据替换结构中的数据? (当然,保持逻辑清洁)。EEG_struct.data = data_filtered;
如果您在命令窗口中执行此操作。如果您想在函数中执行此操作,则需要将替换数据添加为另一个输入
好的,谢谢!最后一个问题,如何指定保存的文件夹?
默认保存到当前文件夹。我认为您可以通过将完整路径作为名称来覆盖它
@Mathieu 只需将完整路径和文件名命名为 ex。 C:\path\to\MATIFLE.mat以上是关于在 MATLAB 中将数据保存到 .mat 文件的主要内容,如果未能解决你的问题,请参考以下文章
在 Matlab 中将 4D 矩阵保存到具有高精度 (%1.40f) 的文件中