2013-04-27 97 views
0

我正在嘗試爲涉及指紋識別的大得多的項目編寫代碼。我試圖使用blockproc,它需要我的128x128矩陣的3x3「窗口」。我有一個52x9的矩陣,矩陣的每一行都描述了一個分叉模式。我需要做的是從128x128矩陣中取出3x3塊,同時從左到右和從上到下移動。然後使用神經網絡將每個片段與分叉模式矩陣進行比較。我需要做光柵以確保我得到128x128矩陣的所有可能的3x3表示。換句話說,我需要移動到右側1像素,獲得3x3窗口,運行網絡,然後再移動1像素等...如果我不能再向右移動(不能創建一個3x3窗口),然後向下移動1個像素並再次重複水平掃描過程。例如:在Matlab中進行光柵掃描

一個簡單的3x5的陣列:

A = [10 11 12 13 14; 
    15 16 17 18 19; 
    20 21 22 23 24]; 

執行光柵掃描以2×3的窗口會導致以下矩陣

A1 = [10 11 12; 
     15 16 17]; 

A2 = [11 12 13; 
     16 17 18]; 

A3 = [12 13 14; 
     17 18 19]; 

A4 = [15 16 17; 
     20 21 22]; 

A5 = [16 17 18; 
     21 22 23]; 

A6 = [17 18 19; 
     22 23 24]; 
+0

什麼問題?在算法上生成A1-A6有困難嗎(或者它們與您的數據集相同)? – 2013-04-27 02:22:33

+0

我無法從給定的矩陣生成A1-A6。我可能會想出一些for/for循環來檢查是否可以形成更多的3x3矩陣,但如果可能的話,我寧願嘗試使用一個函數。我不確定哪個計算速度更快。 – roldy 2013-04-27 02:24:52

回答

2

可以考慮隨時使用colfilt()保持該MATLAB默認情況下沿着行操作,因此您需要翻轉A和塊大小。您可以通過colfilt()檢查與im2col()塊,其在內部調用的順序:

im2col(A', [3,2],'sliding') 
ans = 
    10 11 12 15 16 17 
    11 12 13 16 17 18 
    12 13 14 17 18 19 
    15 16 17 20 21 22 
    16 17 18 21 22 23 
    17 18 19 22 23 24 

其中每列是逐步A1,A2,...或者更準確地說reshape(A1',[],1)reshape(A2',[],1)

+0

感謝這一點,從來沒有新的關於這個功能。 – roldy 2013-04-27 02:32:08

+0

+1不錯的解決方案。 – 0x90 2013-04-27 02:36:12

0

什麼是錯的兩個迴路一個用於行,以及一個用於列:

for row=1:128-3 

for col=1:128-3 

subMatrix = M(row,col:col+3) 

% send to neural network function 
end 

end 
+0

我想我也可以使用循環,因爲我需要跟蹤結果。 – roldy 2013-04-27 19:32:33

+0

Matlab中的循環致命慢 – Bull 2013-05-14 14:36:47

+0

@ user2151446你錯了我的朋友! http://www.matlabtips.com/matlab-is-no-longer-slow-at-for-loops/ – 0x90 2013-05-14 15:41:35