你是否有人知道为什么以下代码因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),:);
而且,有人可以解释一下它究竟在做什么以及它是如何工作的?
答案 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
,但可能有其他方法。