我对MATLAB很陌生,我无法使我的函数工作,以便将我的数据保存到.mat
文件中。
输入:
- `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
:包含1
或0
的矩阵1x143。这样做的目的是只保存干净的数据,在干净矩阵中标记为1
。
If clean(i) is equal to 1:
save data(:,:,i) and labels(:,i)
这是我试图在saving.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而不是a 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'.
谢谢你的帮助!
发布于 2017-11-14 05:45:38
您可以使用您的clean
变量作为逻辑索引,并立即解析您的数据和标签。所以不需要循环。
而且,save命令需要vars的“名称”来保存变量本身,而不是保存变量本身。所以我把每一个都放在“”上。
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]
你会把你的结构放在另一个结构里..。这可能是不理想的,或者需要额外的线去嵌套它。另一方面,只要加载没有输出的MAT文件,load(name)
就会将EEG_struct
放到当前的工作区中。但是,如果在一个函数中,它会在没有被声明的情况下出现,这会使代码更难理解。
选项2使用'-struct‘选项,该选项自动将每个字段分解为MAT文件中的单独vars。所以像这样装货:
EEG_struct =load(名称);
会把所有的田地重新组合在一起。至少在我看来,在一个函数中这样做看起来更干净,但这可能只是我的首选。
所以请评论一下你喜欢哪一种。另外,我也没有在保存中包括clean
。你可以把它附加到垫子上,也可以把它添加到你的结构中。
发布于 2017-11-14 06:02:46
要获得与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');
https://stackoverflow.com/questions/47287146
复制相似问题