2014-01-26 102 views
0

有沒有人有線索,爲什麼下面的代碼崩潰Index exceeds matrix dimensions.錯誤N_SUBJ = 17N_SUBJ = 14,但不是例如值爲13,15,16Matlab代碼意外崩潰

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

「Crashing」不是描述性的。怎麼了?什麼是完整的錯誤信息? – horchler

+0

@horchler - 實際上它是描述性的,因爲這個代碼是自動創建的。只要運行它就可以看到錯誤信息......反正它是'索引超過矩陣尺寸。' – Matteo

+0

不是。這會假設當我運行你的代碼時,我看到了與你完全相同的東西。對於不同的操作系統和Matlab版本以及OP,並不總是發佈所有相關的部分,如果兩個人看到相同的東西,則無法知道。即使我運行它並得到一個錯誤,我怎麼知道它是否是同一個?事情也可以依賴於工作區。我一直在追逐太多的野雁,我並不總是想要猜測某人可能會遇到什麼。另外,當我發佈我的評論時,我不在一臺可以訪問Matlab的計算機上,這是另一個原因。 – horchler

回答

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)計算選擇哪一行,:表示所有列。

+0

感謝您的回答,是的,這正是我正在觀察的消息,但我的問題是爲什麼它會崩潰某些值,而其他值不會。任何線索? – Matteo

1

矩陣SUBJ_COLR是64×3,從而N_SUBJ_COLR等於64。你索引到64行的SUBJ_COLR和在一些情況下,特定索引大於行的數量時,產生了Index exceeds matrix dimensions.錯誤。所以,真正的問題是,爲什麼這個片段

1+[0:(N_SUBJ-1)]*round(N_SUBJ_COLR/N_SUBJ) 

計算結果爲數字比64的N_SUBJ一些值更大?該表達式可以改寫爲:

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 

在那裏我已經通過64爲清楚起見替換N_SUBJ_COLR。後者的表達式更清楚地表明矢量中最大的索引將是什麼,以及它如何取決於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)正在增長以保持總項低於64.一種選擇可能是將round替換爲floor,但可能有其他方法。

+0

非常感謝您的明確答案! ;) – Matteo

+0

@Matteo:不客氣。 – horchler