【问题标题】:Comparing adjacent elements in MATLAB在 MATLAB 中比较相邻元素
【发布时间】:2010-02-13 11:40:44
【问题描述】:

有谁知道如何将数组中的元素与相邻元素进行比较?

例如,如果我有一个数组:

0 0 0 1 1 1 1 0 
0 1 1 1 1 1 1 0 
0 1 0 1 1 1 1 0
0 1 1 1 1 1 0 0
0 0 0 0 1 1 1 1
1 1 1 1 1 1 1 1

有没有办法循环遍历每个元素,并对其周围的元素是否等于1进行逻辑测试?

【问题讨论】:

    标签: arrays matlab comparison matrix


    【解决方案1】:

    糟糕,好像有人在做家庭作业。也许是人生游戏?

    有很多方法可以进行这样的测试。但是要学会以矢量化的形式来做。这涉及了解 matlab 如何进行索引,以及二维数组的元素如何存储在内存中。这将需要一些时间来详细解释,而不是我现在想要做的。不过我肯定会推荐你学习它。

    在那之前,我只是建议,如果你真的在玩生命游戏,那么最好的技巧是使用 conv2。因此,

    A =[0     0     0     1     1     1     1     0
        0     1     1     1     1     1     1     0
        0     1     0     1     1     1     1     0
        0     1     1     1     1     1     0     0
        0     0     0     0     1     1     1     1
        1     1     1     1     1     1     1     1];
    
    B = conv2(A,[1 1 1;1 0 1;1 1 1],'same')
    B =
        1     2     4     4     5     5     3     2
        2     2     5     6     8     8     5     3
        3     4     8     7     8     7     4     2
        2     2     4     5     7     7     6     3
        3     5     6     7     7     7     6     3
        1     2     2     3     4     5     5     3
    

    【讨论】:

    • 哇,我希望我在做有限差分法的时候就知道 conv2。
    • +1 - 我认为任何其他解决方案都会过于复杂。 conv2 绝对是解决问题最优雅的方法。
    • @Jacob:我同意。但只是为了回答 OP 的问题,也许您应该添加 B==8 来检测 8 个邻居都等于 1 的元素。您当然可以更改掩码以仅检查直接的 4 个邻居(无对角线)跨度>
    • 另外,如果您想正确处理边缘,您可能需要使用 imfilter 函数的边框复制选项,例如:B = imfilter(A,[1 1 1;1 0 1; 1 1 1],'replicate','same','conv')==8
    • @celion:是的,双关语 :) @Amro:毫无疑问,这是一个进步
    【解决方案2】:

    Loren 最近发布了关于这个问题的帖子:http://blogs.mathworks.com/loren/2010/01/19/mathematical-recreations-tweetable-game-of-life/ - 通过研究该帖子中的代码及其 cmets 可以学到很多有趣的东西

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-04
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      相关资源
      最近更新 更多