2017-07-07 151 views
2

我用the same code對兩種不同的輸入矩陣, 在兩種情況下,我將其稱爲「輸入矩陣A」錯誤超出範圍下標Matlab的

第一種情況是一個7000X4

第二種情況是一個29500X12

我需要選定的列中的窗口 分裂,然後對每個窗口 我需要計算在std和值存儲std_vals基質內部

我照顧改變我的輸入變量的值。

在第一種情況下,我的目標是分析第4列, 在第二種情況下我的目標是分析12列

在代碼工作

在第二種情況下,第一種情況下代碼返回了我的錯誤消息

我試圖分析代碼中的所有步驟,但我沒有發現錯誤。

你能幫我理解一下嗎?

column_length=size(A,1); 
Amod= mod(column_length,100); 
if Amod~=0 
    A=A(1:(size(A,1)-Amod),:); 
    end 
newlenght=size(A); 

%selected column vector to analyze 
columnselected=4; 
%window dimension 
window_size=200; 

%overlap between two windows 
overlap=0; 

%increment needed 
step=window_size - overlap; 

%std threshold 
soglia=2; 
std_vals= NaN(size(A,1),1); 
devstd=std(A(:,4)); 

stdInds=bsxfun(@plus,1:step:(size(A,1)-overlap),(0:(window_size-1)).'); 

%In the first case size(stdInds)=200X35 
%In the second case size(stdInds)=200X148 
%In the first case size(repmat(columnselected,size(stdInds))= 200X35 
%In the second case size(repmat(columnselected,size(stdInds))= 200X148 
%In the first case size(A)=7000X4 
%In the second case size(A)=29500X12 
    std_vals=std(A(sub2ind(size(A),stdInds,repmat(columnselected,size(stdInds))))); 

highStdWindows=find(std_vals>soglia); 

我是自學的。爲了更好地理解我的錯誤,我首先在一張紙上重寫了代碼,然後分析了每一步,並研究了輸出。我花了4個多小時。

我也試過把第二種情況放在一個7000X12向量中,但是代碼給我返回了同樣的錯誤。

我覺得我的方法不是很有效。 enter image description here

+0

我沒有解決你爲什麼會得到錯誤,但我確實提供了另一種解決方案,以解決窗口之間零重疊的瑣碎情況。 –

+0

@ b3。數據集中存在一些奇怪的錯誤或異常,我會深入,因爲我嘗試了102047X12,它的工作沒有問題 –

回答

0

由於您的窗口重疊爲零,下面的代碼應該適用於任何輸入數組A。將COLUMN_INDEXWINDOW_SIZE變量更改爲所需的列和窗口大小。

這個想法是重塑所需的列爲WINDOW_SIZE x N。然後簡單地調用std函數,該函數對這個重新整形陣列的列進行操作。

COLUMN_INDEX = 4; 
WINDOW_SIZE = 200; 

windowCount = floor(size(A, 1)/WINDOW_SIZE); 
windowedColumn = reshape(A(1:WINDOW_SIZE*windowCount,COLUMN_INDEX), WINDOW_SIZE, windowCount); 
stdVals = std(windowedColumn); 
1

你從sub2ind得到的錯誤不是由自變量的大小引起的,而是由他們的價值 - 所以要調試的最佳方式將是在這些參數來看看如通過繪製它們。

這裏有一個發生的事情的理論,但它並不能說明一切,你已經報道(它暗示7000x12陣列應該有工作):

我覺得這裏的問題是,你的代碼的第一部分裁剪輸入以使其高度爲100的倍數。但是,您的窗口大小爲200,並且這些數字應該是相同的(對於0重疊)。這是因爲你用1:step:(size(A,1)-overlap) = 1:200:size(A,1)來計算你的窗口的起點,這將產生一個不適合A的最終窗口,除非size(A,1)是200的倍數。

考慮到你已經嘗試了數組的大小:

  • 7000x4:7000是200的倍數所以此工程
  • 29500x12:29500是不是200所以這次失敗的倍數(的最後一個元素1:200:29500是29401,那麼最後一個窗口是29401:29600)
  • 102047x12:102047被截斷爲102000這是200的倍數所以此工程
  • 7000x12:這應該以同樣的方式爲7000x4工作 - 這與你所看到的不一致!