【问题标题】:Efficient method of locating adjacent elements in a matrix在矩阵中定位相邻元素的有效方法
【发布时间】:2016-11-03 02:52:52
【问题描述】:

我正在尝试编写一些代码来定位与矩阵中给定条目正交的元素。输出需要包括元素本身、它们的索引,并且算法也需要适用于边缘。例如,考虑

A = [ 1 2 5 6 7
      2 3 1 6 9
      3 6 7 8 1 ] 

然后如果我想要与条目 (2,2) 相邻的元素,代码将返回:

    [2,2,1,6] %-> these elements are orthogonal to entry (2,2)
    [w,x,y,z] %-> where w,x,y,z correspond to the index of the orthogonal entries 
                 %found (they can be linear indices or otherwise).

所以我实现了自己的功能来做到这一点,而且我意识到它非常糟糕。它似乎并不能始终如一地适用于边缘(尽管我可以尝试填充矩阵并查看是否可以修复它 - 我还没有机会),而且重要的是,我的代码在整个该死的矩阵上循环。所以它的效率很低。我想知道是否有人有一种快速、有效的方法来做我上面概述的事情? MATLAB 似乎没有执行此操作的函数——我已经检查过了。

非常感谢您的帮助。

【问题讨论】:

  • 我不明白为什么需要循环。为什么你不能使用基本的索引,只用几个 if 语句来捕捉边缘?

标签: arrays algorithm matlab matrix indexing


【解决方案1】:
for(int i = row-1; i <= row+1; i += 2) {
    for(int j = col-1; j <= col+1; j += 2) {
        if(row>=0 && col>=0 && row < MATRIX_SIZE && col < MATRIX_SIZE)
            std::cout << mat[row, col];
    }
}

在 c++ 中的示例中。输出不会很清楚,但这只是一个例子。在对其进行编程时,假设矩阵中的行/列从 0(不是 1)开始,因此在您的示例中,您给出的解决方案将适合输入(1,1)而不是(2,2)。运行时间当然是O(1)

row = 给定的行参数(例如 1)

col = 给定的列参数(例如也是 1)

MATRIX_SIZE = 矩阵的大小:如果矩阵是 nxn 则 MATRIX_SIZE = n,并且矩阵的每一行/列的最后一个索引是 n-1。

【讨论】:

    【解决方案2】:

    如果您的二维矩阵包含 Wdt 列和 Hgt 行,则第 k 个元素的邻居的索引是

    top = k - Wdt        // if k > Wdt
    bottom = k + Wdt     // if k <= Wdt * Hgt - Wdt  
    right = k + 1        // if (k - 1) mod Wdt > 0
    left = k - 1         // if (k - 1) mod Wdt < Wdt - 1
    

    if 表达式旨在排除边缘元素

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 2012-09-10
      • 2018-10-04
      • 2019-04-09
      相关资源
      最近更新 更多