首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在MATLAB中将数据保存到.mat文件

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

Stack Overflow用户
提问于 2017-11-14 05:31:57
回答 2查看 1.4K关注 0票数 1

我对MATLAB很陌生,我无法使我的函数工作,以便将我的数据保存到.mat文件中。

输入:

  • A结构,有5个字段:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- `data`: 3D matrix of 19x1000x143
- `labels`: 1x143 matrix with `1` or `-1` in it
- `subject_number`: an integer
- `sampling_rate`: an integer, 500 Hz
- `channel_names`: 1x19 matrix with text in it

  • name:文件名的字符串
  • clean:包含10的矩阵1x143。

这样做的目的是只保存干净的数据,在干净矩阵中标记为1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 If clean(i) is equal to 1:
      save data(:,:,i) and labels(:,i)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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而不是a for,但它给我带来了一个我不太明白的错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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'.

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-14 05:45:38

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

而且,save命令需要vars的“名称”来保存变量本身,而不是保存变量本身。所以我把每一个都放在“”上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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');

编辑:如果您只想保留结构中的所有内容,请按您的注释进行。我给了你两个如何保存它的选择。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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文件中。因此,如果您要像这样加载数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
test = load(name);

test = 
        EEG_struct: [1x1 struct]

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

选项2使用'-struct‘选项,该选项自动将每个字段分解为MAT文件中的单独vars。所以像这样装货:

EEG_struct =load(名称);

会把所有的田地重新组合在一起。至少在我看来,在一个函数中这样做看起来更干净,但这可能只是我的首选。

所以请评论一下你喜欢哪一种。另外,我也没有在保存中包括clean。你可以把它附加到垫子上,也可以把它添加到你的结构中。

票数 1
EN

Stack Overflow用户

发布于 2017-11-14 06:02:46

要获得与EEG_struct相同的结构,但只有与clean变量对应的数据/标签,您可以简单地复制现有结构并删除clean=0所在的行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function saving(EEG_struct, clean, name)

newstruct = EEG_struct;
newstruct.data(:,:,logical(~clean)) = '';
newstruct.labels(logical(~clean)) = '';

save(name,'newstruct');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47287146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文