在矩阵中定位相邻元素的有效方法

时间:2016-11-03 02:52:52

标签: arrays algorithm matlab matrix indexing

我试图编写一些代码来定位与矩阵中给定条目正交的元素。输出需要包括元素本身,它们的索引以及算法需要对边缘起作用的内容。例如,考虑

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似乎没有这样做的功能 - 我已经检查过了。

我很感激帮助。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

如果你的2D矩阵包含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-expressions旨在排除边缘元素