使用 KNN 减少二维矩阵大小
Reducing matrix size in 2D using KNN
我有一个很大的二进制矩阵。我想通过使用 knn-approximation 来减小这个矩阵的大小。我的想法是将矩阵以 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?
最初我尝试使用 imresize
让它工作,但没有 "hacks" 就无法完全实现(在我所有的 "proper" 尝试中它都偏离了 1 个值)。
imresize(M, ceil(size(M)/2), 'bilinear') >= 0.4 % This works but is hacky and not recommended!
不过,我可以想办法用二维卷积来解决这个问题。请注意,我填充数组(这需要一个工具箱)以简化最后的索引阶段:
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;
我有一个很大的二进制矩阵。我想通过使用 knn-approximation 来减小这个矩阵的大小。我的想法是将矩阵以 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?
最初我尝试使用 imresize
让它工作,但没有 "hacks" 就无法完全实现(在我所有的 "proper" 尝试中它都偏离了 1 个值)。
imresize(M, ceil(size(M)/2), 'bilinear') >= 0.4 % This works but is hacky and not recommended!
不过,我可以想办法用二维卷积来解决这个问题。请注意,我填充数组(这需要一个工具箱)以简化最后的索引阶段:
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;