2011-03-15 2 views
1

행렬과 2 개의 매개 변수가 있습니다. 첫 번째 매개 변수 n은 선택할 요소 수입니다. 두 번째는 윈도우 크기 m입니다.MATLAB에서 루프를 사용하지 않고 행렬의 각 m-by-m 창에서 n 요소를 추출하려면 어떻게합니까?

매트릭스의 각 m-m 창에서 n 개의 요소를 선택하고 싶습니다. 결과적으로 p -by-q 셀 배열을 가지며 여기서 pmatrix_height/m이고 qmatrix_width/m입니다.

셀 배열의 각 요소에는 해당 창에서 가장 큰 숫자 인 n이 포함되어 있습니다. 반드시 셀 배열 일 필요는 없으며, 필요한 데이터를 저장할 수 있습니다. 이 작업을 수행하는

+0

| blockproc | http://www.mathworks.com/help/toolbox/images/ref/blockproc.html –

답변

3

한 가지 방법은 먼저 기능 SORT를 사용하여 내림차순으로 각 열을 정렬 기능 IM2COL를 사용하여 행렬의 고유 한 모든 m -by- m 서브 매트릭스를 발견하고, 마지막으로 상단 n 행을 추출하는 것입니다. Bn -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 세포 배열로를 설정하려면 기능 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-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를 사용하여 첨자 이러한 변환 할 수 있습니다 및 함수 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)); 

참고 A의 치수 m의 짝수 배 아니라고 경우에 제로로

함수 IM2COL 뜻 패드 부분 블록. 이 제로 패딩 중 하나가 블록의 상단에 n 값으로 나타나면 해당 행 및 열 인덱스 중 하나 또는 둘 모두가 범위를 벗어납니다 (즉,매트릭스 A에 대한 해당 치수의 크기보다 큰 값을 가짐). 따라서 행 및 열 인덱스가 범위 내에 있는지 확인하여 이후 분석에서 제로 패딩을 포함하지 않도록 할 수 있습니다.

+0

고마워, 고마워 ... 이건 멋지다.하지만 실제로 모든 창에서 매트릭스의 요소를 줄 것이다. 내가 원하는 것은 그것도 원래 매트릭스와 그 값의 위치를 ​​제공해야한다는 것입니다. 및 각 창은 행렬 요소 자체와 요소가있는 위치의 좌표를 포함하는 색인 ​​p 및 q 색인으로 인식되어야합니다. – Shan

+0

고마워 다시 gnovice ... 귀하의 의견이 올바른지 ...이 같은 p -에 - q를 배열로 변경할 수 있습니다 ... 단 누락 일이 행과 열 번호는 실제로 이러한 값은 매트릭스 A에 위치하고 있습니다 예를 들어, 첫 번째 창을 묘사 한 cellarray (1,1)은 [col_num row_mum value]가되어야합니다 ... 지금은 분명합니다. Shan – Shan

+0

@Shan : 원래 행렬에 대해 행과 열 인덱스를 얻는 것이 훨씬 까다 롭습니다. 그걸 알아내는 데 더 많은 시간이 필요할 것입니다. – gnovice

관련 문제