摆脱对称矩阵的上三角部分或下三角部分

时间:2017-03-09 18:05:59

标签: matlab matlab-figure

我有一些统计值的对称矩阵,我想在Matlab中使用imagesc绘制。矩阵的大小是112 X 28,这意味着我想为每列显示4行。如何摆脱这个矩阵的上下三角部分?因为这意味着每列删除4行,对角线tril或triu函数不起作用(它们用于方形矩阵)。 感谢

5 个答案:

答案 0 :(得分:4)

您可以使用kron功能

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

答案 1 :(得分: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));

答案 2 :(得分:2)

我想出了一个使用meshgrid

的解决方案

首先定义一个覆盖矩阵所有索引的网格

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

您想要屏蔽对角线4x = 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

答案 3 :(得分: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

答案 4 :(得分: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);