【问题标题】:Reducing matrix size in 2D using KNN使用 KNN 在 2D 中减小矩阵大小
【发布时间】:2018-11-11 08:25:52
【问题描述】:

我有一个很大的二进制矩阵。我想通过使用 knn 近似来减小这个矩阵的大小。我的想法是将矩阵聚类为 4 个邻居组,如果组中 1 的数量大于或等于零的数量,则将该组替换为 1。

具体来说,设矩阵为

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|
------------

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

1 1 0
1 1 0
0 1 0

通过用多数分数替换组。 MATLAB 如何有效地做到这一点?

【问题讨论】:

  • 几个问题: 1) 您的矩阵是否总是将余数分成块? 2) 您使用的是哪个 MATLAB 版本? 3)你有图像处理工具箱吗? 4) 你是否已经尝试过(例如mat2cell)?
  • 1) 不。如图所示,剩余部分被分组到剩余大小中。 2) 我使用的是 2016b 版。 3) 是的,我有图像处理工具箱。 4)不。除了使用循环拆分之外,我没有尝试任何其他方法。

标签: matlab matrix binary-data knn downsampling


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-19
    • 2022-06-14
    • 1970-01-01
    • 2021-05-11
    • 2013-12-20
    • 1970-01-01
    • 2022-07-31
    • 1970-01-01
    相关资源
    最近更新 更多