【问题标题】:Simple way in matlab to count number of adjacent non-zero values in matrix?matlab中计算矩阵中相邻非零值数量的简单方法?
【发布时间】:2015-02-16 01:19:34
【问题描述】:

我是 Matlab 的新手,我必须在 matlab 上创建一个扫雷游戏,在其中我生成一个由 1 和 0 组成的随机矩阵 A,其中 1 是地雷,而 0 不是。 然后我必须创建一个矩阵 B,其中每个元素必须是矩阵 A 中相邻地雷(或地雷)的数量。这些(或地雷)在矩阵 B 中变为 10。

例如,如果 A = [0 1 0 1 0 1]

B= [2 10 2 10 3 10]

我不知道如何设置矩阵 B 以便它可以计算矩阵 A 的相邻数量并为每个元素设置它。 有没有简单的方法来做到这一点?

【问题讨论】:

  • 抱歉,我不明白B 的第 5 个元素是 3 而不是 2,哈哈。
  • @Benoit_11 第一个元素应该是 1 我认为...
  • @David 是的,我也这么认为。

标签: algorithm matlab matrix


【解决方案1】:

我认为你的B 向量应该是[1 10 2 10 2 10]

对于您的矢量案例,您可以执行以下操作。

B=zeros(size(A)); %// to initialise the B vector as 0's

然后要获得每个位置附近有多少地雷,您只需将该位置左侧和右侧的数字相加即可。请记住,在端点的左侧或右侧只能有地雷。

B(2:end-1)=A(1:end-2)+A(3:end); %// counting mines on both sides
B(1)=A(2); %// only on the right of the first location
B(end)=A(end-1); %// only on the end at the last location

然后要将 10 放在地雷所在的位置,您只需在 A 中找到 1,然后使用逻辑索引将 B 中的位置变为 10。

B(A==1)=10; %// find where A=1 (mines) and set the element of B to 10

同样的方法适用于矩阵,但您必须小心获取每个位置周围的所有元素,并且还必须小心边界。

【讨论】:

    【解决方案2】:

    你也可以使用convolution

    A=[0 1 0 1 0 1];
    B=ones(1,3);
    B(2) = 0;
    R=conv(A,B, 'same');
    R(find(A==1))= 10      
    
    R =
    
    1   10    2   10    2   10
    

    B 是您要考虑的社区。您想要两个最近的邻居加上实际值,因此 B 是一个 1x3 向量。

    A=[0 1 0 1 0 1];
    B=ones(1,3);
    

    您只需要相邻的值,因此将中心点设置为零

     B(2) = 0;
    

    卷积AB。使用same 选项,使输出与您的输入具有相同的大小。

    R=conv(A,B, 'same');
    

    10替换你的地雷。

    R(find(A==1))= 10 
    

    二维

    您可能希望在二维中获取当前单元格周围的地雷数量。 然后你只需创建一个19x9 邻域,并在二维中卷积AB

    A=ones(10);
    A(2:2:end, 2:2:end) = 0 % Create your grid. Every other cell is a mine.
    B=ones(3);
    B(2,2) = 0  % Exclude the current cell
    R=conv2(A,B,'same');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多