matlabbatch{1}.spm.stats.fmri_spec.sess.scans = cellstr(spm_select('ExtFPList', curWPAT, '^sw*.nii', Inf));matlab运行不出来,怎么改
时间: 2023-11-22 14:55:28 浏览: 252
这段代码中出现了两个函数:`cellstr` 和 `spm_select`。`cellstr` 函数用于将一个字符数组转化为一个单元格数组,而 `spm_select` 函数用于选择符合特定条件的文件。因此,可能出现问题的地方有两个:
1. `cellstr` 函数的输入参数是否正确。
2. `spm_select` 函数是否能够找到符合条件的文件。
针对这两个问题,你可以分别进行以下调整:
1. 如果 `spm_select` 函数找到了符合条件的文件,但是 `cellstr` 函数的输入参数不正确,那么你可以尝试使用以下代码进行修改:
```matlab
files = spm_select('ExtFPList', curWPAT, '^sw*.nii', Inf); % 获取符合条件的文件
matlabbatch{1}.spm.stats.fmri_spec.sess.scans = cellstr(files); % 将文件转化为单元格数组
```
这样就可以避免 `cellstr` 函数的输入参数不正确的问题。
2. 如果 `spm_select` 函数找不到符合条件的文件,可以检查一下 `curWPAT` 是否设置正确,是否存在符合条件的文件。比如,你可以尝试使用以下代码来查看 `curWPAT` 下是否有符合条件的文件:
```matlab
spm_select('FPList', curWPAT, '^sw*.nii')
```
如果可以找到符合条件的文件,可以尝试重新运行原来的代码。如果还是出现问题,可以进一步检查代码的其他部分。
相关问题
clear;clc parentdir = 'F:\data process\fMRI\fmrioutput'; % 定义储存各被试源文件的上级文件夹 cd(parentdir); % 进入这个上级文件夹 allsubjects = dir('sub*');%查找该文件夹下的所有被试 subinfos = numel(allsubjects); for i=1:numel(allsubjects) % 对每个被试进行循环 cursubject = allsubjects(i).name; % 找到当前被试的名字 matlabbatch=cell(1); curWPAT = fullfile(parentdir,cursubject,'WPAT'); curfucout=fullfile('F:\data process\fMRI\fmrioutput',cursubject,'WPAT') matlabbatch{1}.spm.stats.fmri_spec.dir = {curfucout}; matlabbatch{1}.spm.stats.fmri_spec.sess.scans = cellstr(spm_select('ExtFPList', curWPAT, '^sw*.nii', Inf)) matlabbatch{1}.spm.stats.fmri_spec.timing.units = 'scans'; matlabbatch{1}.spm.stats.fmri_spec.timing.RT = 2; matlabbatch{1}.spm.stats.fmri_spec.timing.fmri_t = 16; matlabbatch{1}.spm.stats.fmri_spec.timing.fmri_t0 = 8; %% matlabbatch{1}.spm.stats.fmri_spec.sess.cond = struct('name', {}, 'onset', {}, 'duration', {}, 'tmod', {}, 'pmod', {}, 'orth', {}); matlabbatch{1}.spm.stats.fmri_spec.sess.multi = {'D:\data process\fMRI\onsets\subject(i)_run1.mat'}; matlabbatch{1}.spm.stats.fmri_spec.sess.regress = struct('name', {}, 'val', {}); matlabbatch{1}.spm.stats.fmri_spec.sess.tempxx=dir(fullfile(curfucout,'rp*.txt')) matlabbatch{1}.spm.stats.fmri_spec.sess.hpf = 128; matlabbatch{1}.spm.stats.fmri_spec.fact = struct('name', {}, 'levels', {}); matlabbatch{1}.spm.stats.fmri_spec.bases.hrf.derivs = [0 0]; matlabbatch{1}.spm.stats.fmri_spec.volt = 1; matlabbatch{1}.spm.stats.fmri_spec.global = 'None'; matlabbatch{1}.spm.stats.fmri_spec.mthresh = 0.8; matlabbatch{1}.spm.stats.fmri_spec.mask = {''}; matlabbatch{1}.spm.stats.fmri_spec.cvi = 'AR(1)'; matlabbatch{2}.spm.stats.fmri_est.spmmat(1) = cfg_dep('fMRI model specification: SPM.mat File', substruct('.','val', '{}',{1}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','spmmat')); matlabbatch{2}.spm.stats.fmri_est.write_residuals = 0; matlabbatch{2}.spm.stats.fmri_est.method.Classical = 1; matlabbatch{3}.spm.stats.con.spmmat(1) = cfg_dep('Model estimation: SPM.mat File', substruct('.','val', '{}',{2}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','spmmat')); matlabbatch{3}.spm.stats.con.consess{1}.tcon.name = 'Old'; matlabbatch{3}.spm.stats.con.consess{1}.tcon.weights = 1; matlabbatch{3}.spm.stats.con.consess{1}.tcon.sessrep = 'none'; matlabbatch{3}.spm.stats.con.delete = 0; end;怎么改
这段代码有几个语法错误,你可以试着按照下面的修改来运行:
```matlab
clear;clc;
parentdir = 'F:\data process\fMRI\fmrioutput'; % 定义储存各被试源文件的上级文件夹
cd(parentdir); % 进入这个上级文件夹
allsubjects = dir('sub*');%查找该文件夹下的所有被试
subinfos = numel(allsubjects);
for i=1:numel(allsubjects) % 对每个被试进行循环
cursubject = allsubjects(i).name; % 找到当前被试的名字
matlabbatch=cell(1);
curWPAT = fullfile(parentdir,cursubject,'WPAT');
curfucout=fullfile('F:\data process\fMRI\fmrioutput',cursubject,'WPAT');
matlabbatch{1}.spm.stats.fmri_spec.dir = {curfucout};
matlabbatch{1}.spm.stats.fmri_spec.sess.scans = cellstr(spm_select('ExtFPList', curWPAT, '^sw*.nii', Inf));
matlabbatch{1}.spm.stats.fmri_spec.timing.units = 'scans';
matlabbatch{1}.spm.stats.fmri_spec.timing.RT = 2;
matlabbatch{1}.spm.stats.fmri_spec.timing.fmri_t = 16;
matlabbatch{1}.spm.stats.fmri_spec.timing.fmri_t0 = 8;
%matlabbatch{1}.spm.stats.fmri_spec.sess.cond = struct('name', {}, 'onset', {}, 'duration', {}, 'tmod', {}, 'pmod', {}, 'orth', {});
matlabbatch{1}.spm.stats.fmri_spec.sess.multi = {['D:\data process\fMRI\onsets\' cursubject '_run1.mat']};
matlabbatch{1}.spm.stats.fmri_spec.sess.regress = struct('name', {}, 'val', {});
matlabbatch{1}.spm.stats.fmri_spec.sess.tempxx=dir(fullfile(curfucout,'rp*.txt'));
matlabbatch{1}.spm.stats.fmri_spec.sess.hpf = 128;
matlabbatch{1}.spm.stats.fmri_spec.fact = struct('name', {}, 'levels', {});
matlabbatch{1}.spm.stats.fmri_spec.bases.hrf.derivs = [0 0];
matlabbatch{1}.spm.stats.fmri_spec.volt = 1;
matlabbatch{1}.spm.stats.fmri_spec.global = 'None';
matlabbatch{1}.spm.stats.fmri_spec.mthresh = 0.8;
matlabbatch{1}.spm.stats.fmri_spec.mask = {''};
matlabbatch{1}.spm.stats.fmri_spec.cvi = 'AR(1)';
matlabbatch{2}.spm.stats.fmri_est.spmmat(1) = cfg_dep('fMRI model specification: SPM.mat File', substruct('.','val', '{}',{1}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','spmmat'));
matlabbatch{2}.spm.stats.fmri_est.write_residuals = 0;
matlabbatch{2}.spm.stats.fmri_est.method.Classical = 1;
matlabbatch{3}.spm.stats.con.spmmat(1) = cfg_dep('Model estimation: SPM.mat File', substruct('.','val', '{}',{2}, '.','val', '{}',{1}, '.','val', '{}',{1}), substruct('.','spmmat'));
matlabbatch{3}.spm.stats.con.consess{1}.tcon.name = 'Old';
matlabbatch{3}.spm.stats.con.consess{1}.tcon.weights = 1;
matlabbatch{3}.spm.stats.con.consess{1}.tcon.sessrep = 'none';
matlabbatch{3}.spm.stats.con.delete = 0;
spm_jobman('run',matlabbatch);
end
```
主要的修改如下:
1. 在 `curfucout` 赋值语句的末尾加上分号;
2. 在 `matlabbatch{1}.spm.stats.fmri_spec.sess.multi` 赋值语句中,使用字符串拼接的方式来生成文件路径;
3. 在 `matlabbatch{1}.spm.stats.fmri_spec.sess.tempxx` 赋值语句中,使用 `dir` 函数来列出相关文件;
4. 最后添加了一个 `spm_jobman` 函数来运行 `matlabbatch`。
无法执行赋值,因为此类型的变量不支持使用点进行索引。 出错 Fristlevel (第 13 行) matlabbatch.spm.stats.fmri_spec.sess.scans = cellstr(spm_select('ExtFPList', curWPAT, '^sw*.nii', Inf)),怎么改
这个错误是因为 `matlabbatch.spm.stats.fmri_spec.sess.scans` 的类型不支持使用点进行索引。你可以尝试使用大括号 `{}` 进行索引,如下所示:
```
matlabbatch{1}.spm.stats.fmri_spec.sess.scans = cellstr(spm_select('ExtFPList', curWPAT, '^sw*.nii', Inf));
```
或者,你也可以使用 `setfield` 函数来设置结构体中的字段值,如下所示:
```
matlabbatch = setfield(matlabbatch, 'spm', struct('stats', struct('fmri_spec', struct('sess', struct('scans', cellstr(spm_select('ExtFPList', curWPAT, '^sw*.nii', Inf)))))));
```
这样就可以成功赋值了。
阅读全文