【问题标题】:MATLAB Add 1's to matrix elements around a specific elementMATLAB 将 1 添加到特定元素周围的矩阵元素
【发布时间】:2014-09-30 02:27:00
【问题描述】:

使用 MATLAB,我有一个矩阵,例如:

1 1 0
1 0 1
1 1 1

目的是将 0 表示为扫雷程序中的地雷,并且 0 周围的值应反映与其相邻的地雷数量。

因此创建一个像这样的向量:

1 2 0 
1 0 2
1 1 1

我曾想过将零周围的元素作为子矩阵,然后加1,但它会将0变成1。

我将如何编写这样的任务?

【问题讨论】:

  • [1 1 0;1 1 1;1 0 1] 想要什么输出?你想要[0 1 0;1 2 2;1 0 1]吗?这会把 1,1 元素变成地雷吗?
  • 请考虑通过单击右侧的复选标记来接受最适合您的答案。

标签: matlab matrix indexing


【解决方案1】:

我认为这可以通过简单的卷积加上对结果矩阵的一些后处理来实现,如下所示:

% 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

【讨论】:

    【解决方案2】:

    Parag's answer 将是我的第一选择。另一种方法是使用blockproc(图像处理工具箱):

    blockproc(~M, [1 1], @(x)sum(x.data(:)), 'Bordersize', [1 1], 'TrimBorder', 0).*M
    

    【讨论】:

      【解决方案3】:

      听起来您正在寻找应用(二维)过滤器:

      M = [1 1 0; 1 0 1; 1 1 1]==0;
      
      F = filter2(ones(3),M);
      F(M)=0
      

      中间线基本上完成了创建计数的工作(应用过滤器)。最后一行确保地雷保持在值 0。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-14
        • 1970-01-01
        • 1970-01-01
        • 2017-11-01
        相关资源
        最近更新 更多