使用KNN缩小2D矩阵尺寸

时间:2018-11-11 08:25:53

标签: matlab matrix binary-data knn downsampling

我有一个很大的二进制矩阵。我想通过使用knn-approximation减小此矩阵的大小。我的想法是将矩阵分为4个相邻的组,如果组中1的数目大于或等于零,则将该组替换为1。

具体来说,让矩阵为

extension ViewController: CustomCollectionViewDelegate {

    func collectionViewDidScroll(_ scrollView: UIScrollView) {

        //do something...
    }
}

首先,我要将邻居组创建为

1 0 0 1 0 
0 1 1 0 0 
1 1 0 0 0 
0 1 1 1 0
0 0 1 1 0
1 0 0 1 0

然后我要生成的最终矩阵是

1 0 |0 1| 0| 
0 1 |1 0| 0|
------------
1 1 |0 0| 0| 
0 1 |1 1| 0|
------------
0 0 |1 1| 0|
------------

通过将组替换为多数得分。我该如何有效地使用MATLAB?

1 个答案:

答案 0 :(得分:1)

最初,我尝试使用imresize使它正常工作,但是没有“ hacks”(在我所有的“正确”尝试中它都减少了1个值)就无法完全获得它。

imresize(M, ceil(size(M)/2), 'bilinear') >= 0.4 % This works but is hacky and not recommended!

但是,我可以想到一种使用2D卷积解决此问题的方法。请注意,我填充数组(需要工具箱)以简化最后的索引阶段:

function C = q53247013(M)

if nargin < 1

  M = [
    1 0 0 1 0 
    0 1 1 0 0 
    1 1 0 0 0 
    0 1 1 1 0
    0 0 1 1 0
    1 0 0 1 0];

end

% Constants:
BLK_SZ = 2;
A = ones(BLK_SZ);

% Pad array if needed (note: this WILL require modification if BLK_SZ > 2 ):    
padBottom = rem(size(M,BLK_SZ),1);
padRight = rem(size(M,BLK_SZ),2);
M = padarray(M, [padBottom, padRight], 'replicate', 'post');

% Perform convolution:    
C = conv2(M, A, 'valid') >= ceil(BLK_SZ^2 / 2);

% Remove every other row and column:
C = C(1:2:end, 1:2:end);

另一种替代方法是blockproc函数:

C = blockproc(M, [2 2], @(x)sum(x.data(:))) >= 2;