2017-03-09 91 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