我有一個矩陣和2個參數。第一個參數n
是要選擇的元素的數量。第二個是窗口大小m
。如何從矩陣的每個m-m窗口中提取n個元素而不使用MATLAB中的循環?
我想選擇n
來自矩陣的每個m
-窗口的元素數量。因此,我們將有一個p
通過q
單元陣列,其中p
是matrix_height/m
和q
是matrix_width/m
。
單元格數組的每個元素都包含來自相應窗口的最大數字。它不一定需要是單元陣列,它可以是存儲必要數據的任何東西。要做到這一點
我有一個矩陣和2個參數。第一個參數n
是要選擇的元素的數量。第二個是窗口大小m
。如何從矩陣的每個m-m窗口中提取n個元素而不使用MATLAB中的循環?
我想選擇n
來自矩陣的每個m
-窗口的元素數量。因此,我們將有一個p
通過q
單元陣列,其中p
是matrix_height/m
和q
是matrix_width/m
。
單元格數組的每個元素都包含來自相應窗口的最大數字。它不一定需要是單元陣列,它可以是存儲必要數據的任何東西。要做到這一點
一種方法是先使用功能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
單元陣列,您可以使用函數NUM2CELL和RESHAPE做到這一點:
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
現在你可以收集行索引,列索引以及使用該功能MAT2CELL和RESHAPE值連成一個單元陣列:
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
的該維度的大小的值)。因此,通過檢查行和列索引是否在範圍內,可以確保在隨後的分析中不包括任何零填充。
非常感謝gnovice ...這很酷...但它實際上會給每個窗口矩陣的元素.. 。我想要的是它也應該給這些值的位置以原始矩陣。 和每個窗口應該被識別爲包含矩陣元素本身的索引p和q索引以及它所在的元素的座標。 – Shan 2011-03-15 16:47:40
再次感謝gnovice ...你的評論是正確的...它可以被改變爲像這樣的p-by-q數組......只有缺少的東西是這些值實際位於矩陣A中的行和列號例如cellarray(1,1)描述第一個窗口應該會導致[col_num row_mum值] ...我希望現在已經很清楚了。 Shan – Shan 2011-03-15 17:08:51
@Shan:獲得與原始矩陣相關的行和列索引要複雜得多。這需要更多時間才能弄清楚。 – gnovice 2011-03-15 17:10:49
你可以看看| blockproc | http://www.mathworks.com/help/toolbox/images/ref/blockproc.html – 2011-03-15 18:28:55