"指数超过矩阵维度"在Matlab中分配给结构数组时

时间:2014-09-23 15:24:32

标签: 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';
    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结构中数组的知识和(明显有缺陷的)知识,对我来说没有任何意义。在过去,我通过宣布我将使用新的下标来制作更长的结构数组。

以下是Matlab's instructions for how to assign to a struct。我能看到的唯一区别是,他们第一次分配到数组时不会使用(1)下标,我尝试了它并没有区别。

此代码可以正常工作:

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

我正在努力理解这种差异。非常感谢您提供的任何帮助,如果我需要提供更多信息,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:0)

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

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}中。这只是我的代码中的概念性失败,而不是任何其他人可能已经认识到的。非常感谢你的时间,我很抱歉让你误入歧途。