Matlab에서 imagesc를 사용하여 음모를 표시하려는 통계 값의 대칭 행렬이 있습니다. 행렬의 크기는 112 X 28입니다. 즉, 각 열에 대해 4 개의 행을 표시하려고합니다. 이 행렬의 위 또는 아래 삼각형 부분을 제거하려면 어떻게해야합니까? 즉, 각 열 당 4 개의 행을 삭제하는 것은 대각선으로 tril 또는 triu 함수가 작동하지 않습니다 (사각형 행렬에 해당). 감사대칭 행렬의 위쪽 삼각형 부분 또는 아래쪽 삼각형 부분을 없애기
3
A
답변
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));
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
여기에 마스크가 있습니다. 축이 대칭이 아닙니다.
당신은 그리드에 어떤 분리 라인이나 함수를 정의하기 위해이 방법을 사용할 수 있습니다. 당신은 포물선
mask_parabola = (X-14).^2 >= Y;
을 할 수
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
예 이미지 처리 도구 상자가 있는데 원하는 것을 얻었습니다. 제작자 : imagesc (영) 고마워! –