2017-03-09 3 views
3

Matlab에서 imagesc를 사용하여 음모를 표시하려는 통계 값의 대칭 행렬이 있습니다. 행렬의 크기는 112 X 28입니다. 즉, 각 열에 대해 4 개의 행을 표시하려고합니다. 이 행렬의 위 또는 아래 삼각형 부분을 제거하려면 어떻게해야합니까? 즉, 각 열 당 4 개의 행을 삭제하는 것은 대각선으로 tril 또는 triu 함수가 작동하지 않습니다 (사각형 행렬에 해당). 감사대칭 행렬의 위쪽 삼각형 부분 또는 아래쪽 삼각형 부분을 없애기

답변

3

당신은 이미지 처리 도구 상자이있는 경우 이미지 처리 도구 상자가없는 경우 당신은 당신이 다음 적절한 데이터

msk = imresize(triu(true(min(size(a)))), size(a), 'nearest'); 

% Just zero-out the lower diag 
zeroed = msk .* a; 

% Select the elements in the upper diagonal 
upperdiag = a(msk); 

을 선택하는 데 사용할 수있는 상위 삼각 마스크의 크기를 조정 imresize를 사용할 수 있습니다 (그리고 imresize) 당신은 당신이 사용할 수있는

msk = reshape(repmat(permute(triu(true(min(size(a)))), [3 1 2]), size(a,1)/size(a,2), 1), size(a)); 
+0

예 이미지 처리 도구 상자가 있는데 원하는 것을 얻었습니다. 제작자 : imagesc (영) 고마워! –

4

같은 kron 기능을 수행 할 수

kron(triu(ones(28)),[1 ;1 ;1 ;1]) 
2

나는

[X, Y] = meshgrid([1:28], [1:112]); 

당신은 대각선 4 배 (아래 또는) 위의 모든 값을 마스크하려는 행렬의 모든 인덱스를 포함 그리드를 정의 meshgrid

첫째을 사용하여 솔루션을 함께했다 = y. 마스크를 X와 Y 값의 함수로 정의하십시오.

mask = 4.*X >= Y; %>= Selects above the diagonal, <= selects below the diagonal 

여기에 마스크가 있습니다. 축이 대칭이 아닙니다.

Diagonal Mask

당신은 그리드에 어떤 분리 라인이나 함수를 정의하기 위해이 방법을 사용할 수 있습니다. 당신은 포물선

mask_parabola = (X-14).^2 >= Y; 
을 할 수

Parabola Mask

1

이 좋은 답변을하지만 어쩌면이 하나의 대안 사용 triu 기능 할 수있다 : 다음과 같이 bsxfun와 마스크를 만들 수 있습니다

% image 
img = rand(112, 28); 

% utilize a square matrix to use triu command 
temp = nan(112, 112); 
temp(:, 1:4:end) = img; 
temp = triu(temp, -3); 

% put the relevant elements back 
img = temp(:, 1:4:end); 
2

:

M = 112; % number of rows 
N = 28; % number of columns 
mask = bsxfun(@le, (1:M).', (1:N)*round(M/N)); % create mask 
data = data.*mask; % multiply your data matrix by the mask