2017-03-09 96 views
3

我有一些統計值的對稱矩陣,我想在Matlab中使用imagesc繪圖。矩陣的大小是112 X 28,這意味着我想爲每列顯示4行。我怎樣才能擺脫矩陣的上部或下部三角部分?因爲這意味着每列對角地刪除4行tril或triu函數不起作用(它們用於正方形矩陣)。 感謝擺脫對稱矩陣的上部或下部三角部分

回答

3

如果您有圖像處理工具箱,你可以使用imresize來調整上三角面具,你就可以使用來選擇合適的數據

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),你可以這樣做

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

我想出了利用meshgrid

首先定義覆蓋

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

要屏蔽高於(或低於)的所有值的對角線4倍的你矩陣的所有索引的網格解決方案= 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功能:

% 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

您可以bsxfun創建蒙如下:

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