Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MATLAB中将数据保存到.mat文件_Matlab_Save - Fatal编程技术网

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

在MATLAB中将数据保存到.mat文件,matlab,save,Matlab,Save,我是MATLAB新手,我无法使我的函数工作以将数据保存到.mat文件中 输入: 结构,包含5个字段: 数据:19x1000x143的3D矩阵 标签:1x143矩阵,其中包含1或-1 主题号:一个整数 采样率:一个整数,500 Hz 频道名称:包含文本的1x19矩阵 name:文件名的字符串 clean:一个包含1或0的矩阵1x143 其思想是只保存干净的数据,在干净矩阵中标记为1 If clean(i) is equal to 1: save data(:,:,i) and

我是MATLAB新手,我无法使我的函数工作以将数据保存到
.mat
文件中

输入:

  • 结构,包含5个字段:

    • 数据
      :19x1000x143的3D矩阵
    • 标签
      :1x143矩阵,其中包含
      1
      -1
    • 主题号
      :一个整数
    • 采样率
      :一个整数,500 Hz
    • 频道名称
      :包含文本的1x19矩阵
  • 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
input具有相同形状的结构。 此外,我想使用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'.

谢谢你的帮助

您可以使用
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]
你可以将你的结构放在另一个结构中。。。这可能不理想,或者需要额外的行来取消嵌套。另一方面,仅加载MAT文件而不输出
load(name)
EEG\u struct
放入当前工作区。但是如果在一个函数中,它会在没有声明的情况下突然出现,这使得代码更难理解

选项2使用“-struct”选项,将每个字段自动拆分为MAT文件中的单独变量。这样加载:

test = load(name);

test = 
        EEG_struct: [1x1 struct]
EEG_struct=荷载(名称)

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


所以,评论出你喜欢哪一个。另外,我没有在保存中包含
clean
。您可以将其附加到MAT中,也可以将其添加到结构中。

要获得与
EEG\u 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_结构。@Mathieu看到了我的编辑,以使用各种选项保存结构。谢谢,假设EEG_结构.data是一个矩阵19x1000x134,我的工作区中有一个矩阵,数据过滤,大小相同19x1000x134。如何用筛选的数据替换结构中的数据?(当然,保持逻辑清洁)。
EEG\u struct.data=data\u filtered如果您在命令窗口中执行此操作。如果您想在函数中执行此操作,则需要将替换数据添加为另一个inputOk,谢谢!最后一个问题,如何指定要保存的文件夹?默认情况下,它将保存到当前文件夹中。我想你可以通过把完整的路径作为name@Mathieu只需将完整路径和文件名命名为ex.C:\path\to\MATIFLE.mat