2011-03-15 103 views
1

我有一個矩陣和2個參數。第一個參數n是要選擇的元素的數量。第二個是窗口大小m如何從矩陣的每個m-m窗口中提取n個元素而不使用MATLAB中的循環?

我想選擇n來自矩陣的每個m -窗口的元素數量。因此,我們將有一個p通過q單元陣列,其中pmatrix_height/mqmatrix_width/m

單元格數組的每個元素都包含來自相應窗口的最大數字。它不一定需要是單元陣列,它可以是存儲必要數據的任何東西。要做到這一點

+0

你可以看看| blockproc | http://www.mathworks.com/help/toolbox/images/ref/blockproc.html – 2011-03-15 18:28:55

回答

3

一種方法是先使用功能IM2COL找到你所有的矩陣的獨特m -by- m小矩陣,然後在使用功能SORT降序排序每一列,最後拉出頂n行。如果您的初始矩陣爲A和你的輸出矩陣是B,這是它會是什麼樣子:

B = sort(im2col(A,[m m],'distinct'),1,'descend'); 
B = B(1:n,:); %# Get the top n values 

注意B將是一個n -by- m^2矩陣。如果你想變成一個p -by- q單元陣列,您可以使用函數NUM2CELLRESHAPE做到這一點:

nBlocks = ceil(size(A)./m); %# The number of blocks in each dimension 
B = reshape(num2cell(B,1),nBlocks(1),nBlocks(2)); 

編輯:

如果你也想獲得指數每個值相對於輸入矩陣A,這有點複雜。您可以通過從SORT獲取第二個輸出來完成,在這種情況下,這將是每個m-by-m子矩陣中的值的線性索引。您可以使用功能IND2SUB這些轉換爲標,然後移行和列的索引以說明每個m -by- m塊的位置:

[B,index] = sort(im2col(A,[m m],'distinct'),1,'descend'); 
B = B(1:n,:);     %# Get the top n values 
index = index(1:n,:);   %# Get the top n values 
[r,c] = ind2sub([m m],index); %# Convert linear indices to subscripts 
nBlocks = size(A)./m;   %# The number of blocks in each dimension 
r = r+repmat(0:m:(nBlocks(1)-1)*m,n,nBlocks(2));  %# Shift the row indices 
c = c+kron(0:m:(nBlocks(2)-1)*m,ones(n,nBlocks(1))); %# Shift the column indices 

現在你可以收集行索引,列索引以及使用該功能MAT2CELLRESHAPE值連成一個單元陣列:

B = mat2cell([r(:) c(:) B(:)],n.*ones(1,size(B,2))); 
B = reshape(B,nBlocks(1),nBlocks(2)); 

替代地,可以創建一個結構陣列,而不是使用功能NUM2CELL,單元陣列,並RESHAPE

B = struct('rowIndices',num2cell(r,1),... 
      'colIndices',num2cell(c,1),... 
      'values',num2cell(B,1)); 
B = reshape(B,nBlocks(1),nBlocks(2)); 

注:與事件零

功能IM2COL意願墊部分塊的那一個A尺寸不是的偶數倍m。如果任何這種零填充出現在塊的頂部值中,則對應的行和列索引中的一個或兩個將超出範圍(即,具有大於矩陣A的該維度的大小的值)。因此,通過檢查行和列索引是否在範圍內,可以確保在隨後的分析中不包括任何零填充。

+0

非常感謝gnovice ...這很酷...但它實際上會給每個窗口矩陣的元素.. 。我想要的是它也應該給這些值的位置以原始矩陣。 和每個窗口應該被識別爲包含矩陣元素本身的索引p和q索引以及它所在的元素的座標。 – Shan 2011-03-15 16:47:40

+0

再次感謝gnovice ...你的評論是正確的...它可以被改變爲像這樣的p-by-q數組......只有缺少的東西是這些值實際位於矩陣A中的行和列號例如cellarray(1,1)描述第一個窗口應該會導致[col_num row_mum值] ...我希望現在已經很清楚了。 Shan – Shan 2011-03-15 17:08:51

+0

@Shan:獲得與原始矩陣相關的行和列索引要複雜得多。這需要更多時間才能弄清楚。 – gnovice 2011-03-15 17:10:49

相關問題