2016-11-30 81 views
-1

我使用以下代碼與不同的數據文件,沒有任何問題。但是,有一個文件會產生麻煩,當我使用該文件運行代碼時,出現錯誤:matlab錯誤「索引超出矩陣尺寸」與特定的數據文件

'索引超出矩陣維數'。

我認爲這是因爲'我'等於2546,但是當代碼運行的行:i=i+1,而不是停在2546,它繼續前進並停止(給出錯誤)在2547 - 當然超過矩陣的尺寸。事實上,當代碼停止工作,產生錯誤時,我可以在Workspace中看到'i'等於2547,'j'爲2(而不是5,如果循環可以正常工作)。

由於完全相同的代碼完美地與其他文件一起工作,我認爲這是與這個特定的文件有關。任何有關如何解決問題的見解?

下面是代碼:從colInd

for i=1:size(colInd,1) 
    for j=1:size(colInd,2) 
     if colInd(i,j)>0 && colInd(i,j)<=13 
      M1(i,j)=Windowsdata(i,colInd(i,j)); 
     elseif colInd(i,j)==0 | colInd(i,j)==14 
      M1(i,j)=NaN; 
     elseif colInd(i,j)==-1 | colInd(i,j)==15 
      M1(i,:)=NaN; 
      i=i+1; 
     end 
    end 
end 

實施例的線條,其是從Windowsdata,它是2546×13雙2546×5條

4 5 6 7 8 
-1 0 1 2 3 
2 3 4 5 6 
11 12 13 14 15 
0 1 2 3 4 
5 6 7 8 9 
3 4 5 6 7 
5 6 7 8 9 
-1 0 1 2 3 
11 12 13 14 15 

實施例線路

-4.37370443344116 -1.64714550971985 0.569347918033600 1.62668454647064 3.73541021347046 5.15196514129639 4.04361486434937 1.77491927146912 0.702701866626740 -0.354207783937454 1.18695282936096 2.82701897621155 4.01644039154053 
    3.72757863998413 1.44241857528687 -1.15181946754456 -2.97936320304871 -5.16328191757202 -4.25508642196655 -2.47518587112427 0.287524074316025 -1.17596077919006 -2.04023623466492 -2.78539514541626 -2.96725606918335 -5.59557294845581 
-5.52127933502197 -1.69257545471191 3.61181259155273 4.46472501754761 0.345008432865143 -4.78608989715576 -7.80892658233643 -8.83082866668701 -5.61083126068115 -4.40270948410034 -3.05102157592773 -4.67261123657227 -5.50971889495850 
    1.24733197689056 0.692575275897980 0.549045324325562 1.33569169044495 2.26527953147888 3.19271230697632 1.92626762390137 -0.00543282041326165 -1.76812970638275 -3.55482935905457 -2.28071475028992 2.58129334449768 6.07476711273193 
    2.17950797080994 2.73428583145142 1.63492679595947 -0.256836771965027 -0.773400425910950 -1.04227805137634 -1.82435607910156 -2.64025163650513 -1.53338134288788 -2.29410648345947 -4.26442241668701 -4.76120758056641 -4.47712421417236 
-0.246993020176888 0.157185763120651 0.250829964876175 -0.986824631690979 1.40918886661530 5.03370332717896 8.15515422821045 6.41663646697998 2.43448591232300 -2.98093175888062 -3.53510475158691 -1.89243125915527 1.47953033447266 
    4.36318445205688 5.06837177276611 5.78645181655884 6.97499608993530 7.49895095825195 5.27076244354248 4.75153970718384 4.35132837295532 2.37539553642273 0.8 0.782306909561157 1.98255372047424 1.82295107841492 
    0.393009424209595 0.348423480987549 -0.0242169145494699 -0.451373100280762 0.792472958564758 3.95410203933716 6.95971775054932 6.07247447967529 4.61793804168701 2.25326156616211 1.17793440818787 -1.02191674709320 -1.40514099597931 
    2.97367334365845 2.56695508956909 -0.0324615947902203 -0.512259364128113 -0.169182881712914 1.99416732788086 2.05820631980896 1.26427924633026 -0.107465483248234 -1.26579785346985 -2.51656532287598 -2.19553661346436 -1.86673855781555 
-5.92374515533447 -4.78130531311035 -5.02523994445801 -4.12971973419189 -2.56698751449585 -2.16855669021606 -2.66882371902466 -3.24165868759155 -4.10617780685425 -4.71752023696899 -4.63748264312744 -3.33325529098511 -2.00388121604919 
+0

請提供全* *錯誤報文[MCVE。 – excaza

+0

完整的錯誤信息就像我報道的那樣'索引超過了矩陣的維數.'。沒有線可以說我可以報告或參考。 – dede

+0

'索引超出矩陣的維數.'是您的命令窗口中唯一的東西嗎?什麼是「Windows數據」?它與colInd有什麼關係?請參閱上面的鏈接幫助頁面的「完整」部分。 – excaza

回答

0

如果我理解正確,colInd是一個NxM矩陣,N=2546,並且您期望在最後一個elseif中,通過將i遞增1,最終在下一個外部循環迭代中,從1開始j到迭代中的M

如果這是您想要實現的行爲,則需要使用break語句來突破內部for循環。否則,如果j<size(colInd,2),j將遞增並且內部循環繼續。

如果我正確理解了您所需的行爲,那麼這不是文件問題,而是您的算法問題。但正如@excaza所指出的那樣,您應該給出一個例子,包括必要的變量(如Windows數據)。否則,很難理解你想要做什麼。

編輯:試試這個:

for i=1:size(colInd,1) 
    for j=1:size(colInd,2) 
     if colInd(i,j)>0 && colInd(i,j)<=13 
      M1(i,j)=Windowsdata(i,colInd(i,j)); 
     elseif colInd(i,j)==0 | colInd(i,j)==14 
      M1(i,j)=NaN; 
     elseif colInd(i,j)==-1 | colInd(i,j)==15 
      M1(i,:)=NaN; 
      break; 
     end 
    end 
end 

EDIT2:爲了澄清:如果在迭代其中i=size(colInd,1)(即i=2546)和j<size(colInd,2)(即j<5,假設j=1爲簡單起見),您所描述的問題時最後的elseif成立。因此,導致你的i增加到i=2546+1=2547,並且內循環經歷下一次迭代。現在用j=2,如果您首先嚐試訪問colInd(2547,2),該值超過colInd的尺寸。編輯3:如果你想要更多的Matlab-y實現,因爲for循環不是很好的Matlab編碼風格,我還附加了這個使用向量化的解決方案(雖然不是很棒)。

colInd = [ 4 5 6 7 8; 
-1 0 1 2 3; 
2 3 4 5 6; 
11 12 13 14 15; 
0 1 2 3 4; 
5 6 7 8 9; 
3 4 5 6 7; 
5 6 7 8 9; 
-1 0 1 2 3; 
11 12 13 14 15; 
10 11 12 13 14]; 

Windowsdata = reshape([1:size(colInd,1)*13],[size(colInd,1) 13]); 

M1 = zeros(size(colInd)); 
M2 = zeros(size(colInd)); 

c1 = find(colInd>0&colInd<=13); 
c2 = find(colInd==0|colInd==14); 
c3 = find(colInd==-1|colInd==15); 
[x1,~] = ind2sub(size(colInd),c1); 
[x3,~] = ind2sub(size(colInd),c3); 

M2(c1) = Windowsdata(sub2ind(size(Windowsdata),x1,colInd(c1))); 
M2(c2) = NaN; 
M2(x3,:) = NaN; 

它運行速度約爲循環實施的3-5倍。

編輯:添加缺少的項到sub2ind調用,它給出了相同的結果for循環:

M1 = 
34 45 56 67 78 
NaN NaN NaN NaN NaN 
14 25 36 47 58 
NaN NaN NaN NaN NaN 
NaN  5 16 27 38 
50 61 72 83 94 
29 40 51 62 73 
52 63 74 85 96 
NaN NaN NaN NaN NaN 
NaN NaN NaN NaN NaN 
110 121 132 143 NaN 

M2 = 
34 45 56 67 78 
NaN NaN NaN NaN NaN 
14 25 36 47 58 
NaN NaN NaN NaN NaN 
NaN  5 16 27 38 
50 61 72 83 94 
29 40 51 62 73 
52 63 74 85 96 
NaN NaN NaN NaN NaN 
NaN NaN NaN NaN NaN 
110 121 132 143 NaN 
+0

添加'break'但是,我沒有得到錯誤,但是,當該部分運行並完成時,'i'仍然等於2547,並且'j'現在等於1,這表明代碼在第一個循環,並沒有運行循環從2到5.或者,這是你想檢查? – dede

+0

很明顯'i = 2547',因爲你在最後一個elseif的內部循環中將i增加了1。看來我錯誤地理解了你算法的預期行爲,因爲你沒有恰當地描述,你想要做什麼。如果你可以給出一個玩具的例子,說明你的算法失敗的情況,並且你描述了算法中你期望的行爲,那將會非常有幫助。 –

+0

請參閱我在最初的答案下添加的解釋。 –