使用MATLAB,我有一个矩阵,如:
1 1 0
1 0 1
1 1 1
目的是在扫雷程序中将零代表为地雷,并且0周围的值应反映与其相邻的多少个地雷。
因此创建一个这样的矢量:
1 2 0
1 0 2
1 1 1
我曾考虑将零点周围的元素作为子矩阵然后加1,然后将0变为1。
我该如何编写这样的任务?
答案 0 :(得分:4)
我认为这可以通过简单的卷积加上对结果矩阵的一些后处理来实现,如下所示:
% Defining a 6x6 matrix of zeros and ones
mineMat=randi(2,6,6)-1;
numberOfMines=conv2(double(~mineMat),ones(3,3),'same').*mineMat;
% Result:
mineMat=
1 0 1 1 0 0
0 0 0 1 0 0
1 1 1 1 1 0
1 1 1 1 0 1
0 1 0 0 0 0
0 1 1 0 0 0
numberOfMines=
3 0 3 3 0 0
0 0 0 3 0 0
2 3 2 3 4 0
1 2 2 4 0 4
0 3 0 0 0 0
0 3 3 0 0 0
答案 1 :(得分:0)
Parag's answer将是我的第一选择。另一种方法是使用blockproc
(图像处理工具箱):
blockproc(~M, [1 1], @(x)sum(x.data(:)), 'Bordersize', [1 1], 'TrimBorder', 0).*M
答案 2 :(得分:0)
听起来您正在寻找应用(二维)过滤器:
M = [1 1 0; 1 0 1; 1 1 1]==0;
F = filter2(ones(3),M);
F(M)=0
中间线基本上完成工作(应用过滤器)来创建计数。最后一行确保地雷保持在0的值。