한 가지 방법은 먼저 기능 SORT를 사용하여 내림차순으로 각 열을 정렬 기능 IM2COL를 사용하여 행렬의 고유 한 모든 m
-by- m
서브 매트릭스를 발견하고, 마지막으로 상단 n
행을 추출하는 것입니다. B
가 n
-by- m^2
매트릭스 될 것으로
B = sort(im2col(A,[m m],'distinct'),1,'descend');
B = B(1:n,:); %# Get the top n values
참고 : 초기 행렬 A
하고 당신의 출력 행렬 B
경우,이 그것과 같을 것이다 것입니다. 당신이 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
-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
을 그리고 지금 당신은 행 인덱스, 열 인덱스를 수집 할 수 있습니다 : 당신은 다음 각 m
-by- m
블록의 위치를 설명하기 위해 행과 열 인덱스를 이동, 기능 IND2SUB를 사용하여 첨자 이러한 변환 할 수 있습니다 및 함수 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));
참고 A
의 치수 m
의 짝수 배 아니라고 경우에 제로로
함수 IM2COL 뜻 패드 부분 블록. 이 제로 패딩 중 하나가 블록의 상단에 n
값으로 나타나면 해당 행 및 열 인덱스 중 하나 또는 둘 모두가 범위를 벗어납니다 (즉,매트릭스 A
에 대한 해당 치수의 크기보다 큰 값을 가짐). 따라서 행 및 열 인덱스가 범위 내에 있는지 확인하여 이후 분석에서 제로 패딩을 포함하지 않도록 할 수 있습니다.
| blockproc | http://www.mathworks.com/help/toolbox/images/ref/blockproc.html –