Matlab代码意外崩溃

时间:2014-01-26 02:06:30

标签: matlab

你是否有人知道为什么以下代码因Index exceeds matrix dimensions.N_SUBJ = 17出现N_SUBJ = 14错误而导致崩溃,但对于值13,15,16却没有?

N_PICS = 7
COLR = hsv; 
N_COLR = size(COLR,1); 
COLR = COLR(1+[0:(N_PICS-1)]*round(N_COLR/N_PICS),:);
SUBJ_COLR = hsv; 
N_SUBJ_COLR = size(SUBJ_COLR,1); 
SUBJ_COLR = SUBJ_COLR(1+[0:(N_SUBJ-1)]*round(N_SUBJ_COLR/N_SUBJ),:);

而且,有人可以解释一下它究竟在做什么以及它是如何工作的?

2 个答案:

答案 0 :(得分:1)

当你说崩溃时,我认为你的意思是你看到了错误,Index exceeds matrix dimensions.?如果您看到此错误,则hsv返回的矩阵没有足够的行用于您正在执行的子样本操作。

SUBJ_COLR = SUBJ_COLR(1+[0:(N_SUBJ-1)]*round(N_SUBJ_COLR/N_SUBJ),:);

选择原始矩阵的子集。 1+[0:(N_SUBJ-1)]*round(N_SUBJ_COLR/N_SUBJ)计算要选择的行,:表示所有列。

答案 1 :(得分:1)

矩阵SUBJ_COLR是64乘3,因此N_SUBJ_COLR等于64.您正在索引到SUBJ_COLR的64行,在某些情况下,特定索引是大于行数,导致Index exceeds matrix dimensions.错误。所以问题就是为什么这个片段

1+[0:(N_SUBJ-1)]*round(N_SUBJ_COLR/N_SUBJ)
对于N_SUBJ的某些值,

评估大于64的数字?此表达式可以重写为:

1+(0:round(64/N_SUBJ):round(64/N_SUBJ)*(N_SUBJ-1))

1:round(64/N_SUBJ):round(64/N_SUBJ)*(N_SUBJ-1)+1

为清晰起见,我将N_SUBJ_COLR替换为64。后一个表达式更清楚地显示了向量中最大的索引是什么以及它如何取决于N_SUBJ的值。您可以将此最大索引打印为N_SUBJ

的函数
N_SUBJ = 1:30;
round(64./N_SUBJ).*(N_SUBJ-1)+1

返回

ans =

  Columns 1 through 13

     1    33    43    49    53    56    55    57    57    55    61    56    61

 Columns 14 through 26

    66    57    61    65    69    55    58    61    64    67    70    73    51

  Columns 27 through 30

    53    55    57    59

如您所见,有几个值超过64.这种非线性行为归结为使用round。由round部分创建的整数似乎不够快,因为它们会增加(N_SUBJ-1),而round正在增长,以保持总项少于64.一个选项可能是替换{ {1}}使用floor,但可能有其他方法。