Arrays &引用;索引超出了矩阵维度”;在Matlab中指定给结构数组时

Arrays &引用;索引超出了矩阵维度”;在Matlab中指定给结构数组时,arrays,matlab,matrix,struct,indexoutofboundsexception,Arrays,Matlab,Matrix,Struct,Indexoutofboundsexception,我试图在Matlab中为结构中包含的数组赋值。我对“索引超过矩阵维度”的错误感到困惑,因为据我所知,我正在以官方文档为例,做一些过去对我有用的事情。我希望这是足够相关的背景: for m = 1:tally matlabbatch{2}.spm.stats.fmri_spec.sess(m).scans = files{m}; matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(1).name = 'button_press';

我试图在Matlab中为结构中包含的数组赋值。我对“索引超过矩阵维度”的错误感到困惑,因为据我所知,我正在以官方文档为例,做一些过去对我有用的事情。我希望这是足够相关的背景:

for m = 1:tally
    matlabbatch{2}.spm.stats.fmri_spec.sess(m).scans = files{m};
    matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(1).name = 'button_press';
    matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(1).onset = events.bp.onsets{m};
    matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(1).duration = 0;
    matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(1).tmod = 0;
    matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(1).pmod = struct('name', {}, 'param', {}, 'poly', {});

    sess_onsets = events.conditions.sessions(tally).onsets{1};
    for n = 1:numel(sess_onsets)
        len = numel(sess_onsets{n});
        cond_list = events.conditions.names{tally};
        cond_onsets = sess_onsets{n};
        matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(n+1).name = cond_list{n};
        matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(n+1).onset = cond_onsets;
        matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(n+1).duration = repmat([4], len, 1);
        matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(n+1).tmod = 0;
        matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(n+1).pmod = struct('name', {}, 'param', {}, 'poly', {});
    end

    matlabbatch{2}.spm.stats.fmri_spec.sess(m).multi = {''};
    matlabbatch{2}.spm.stats.fmri_spec.sess(m).regress = struct('name', {}, 'val', {});
    matlabbatch{2}.spm.stats.fmri_spec.sess(m).multi_reg = rp{k};
    matlabbatch{2}.spm.stats.fmri_spec.sess(m).hpf = 128;
end
错误出现在这一行:

matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(n+1).name = cond_list{n};
当我在调试器中转到这一行时,它是这个表达式

matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(n+1)
这就产生了“索引超过矩阵维数误差”。即使n为1,它也会这样做。从理论上讲,根据我对其他语言的经验,这是有道理的。Cond的长度为1,我正在尝试分配给第二个插槽。但基于我在Matlab structs中使用数组的经验和(明显有缺陷的)知识,这对我来说没有意义。在过去,我只是通过宣布我将使用新的下标来延长结构数组的长度

给你。我能看到的唯一区别是,他们第一次分配给数组时没有使用(1)下标,我试过了,结果没有什么不同

此代码工作正常:

>> a.b(1).name = 'apple';
>> a.b(2).name = 'banana'
a = b: [1x2 struct]

我正在努力理解其中的区别。非常感谢您提供的任何帮助,如果我需要提供更多信息,请告诉我。谢谢

非常感谢所有试图帮助我的人。我觉得自己像个傻瓜,因为没有向那些试图帮助我的人传达准确的信息而有点内疚。这个问题的标题应该是“我不知道如何使用调试器”。我认为它在第一次执行时失败了,因为当我走到那一行并粘贴时

matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(n+1) 
我犯了个错误。但我现在明白了这个错误的原因是,在这个表达式中粘贴并不能创建下一个数组元素——这是我需要的

matlabbatch{2}.spm.stats.fmri_spec.sess(m).cond(n+1).name = foo

使该元素存在。如果我单击了“继续”,我就会意识到当n=5时,真正的失败在cond_list{n}中。这只是我的代码中的一个概念性错误,其他任何人都不会意识到。非常感谢您抽出时间,我很抱歉将我的声明引入歧途。

我不确定结构数组是否可以容纳任何类型的数组作为字段。所以当
a.b(1).name
起作用时,AFAIK
a.b(1).c(1).name
不会起作用。@sobek,谢谢你的帮助,但除非我误解了你,否则这是不对的<代码>>>a.b.sess(1).cond(1).name='apple';>>a、 b.sess(1.cond(2.name='banana';>>a、 b.sess(2).cond(1).name='apple';>>a、 b.sess(2).cond(2).name='banana'a=b:[1x1 struct]运行时没有错误。我根据软件程序SPM自动生成的代码设计了我的程序。自动生成的代码(太长,无法粘贴到此处)运行时没有错误。您是否查看了错误发生时的循环变量?它发生在两个循环的第一次执行时吗?@sobek,我有,是的,它发生在两个循环的第一次执行时。这确实很奇怪,我必须承认我没有看到错误。您是否尝试过通过串联来增加结构数组,如
arraystuct=[arraystuct,newFields]