快速访问包裹在2D矩阵中的单元格

时间:2016-12-15 10:13:27

标签: c++ math matrix

我有一个包裹着的矩阵。

m_matrixOffset指向包裹矩阵的第一个单元格(0,0)。因此,为了访问我们下面的函数GetCellInMatrix .Logic,每当有人访问一个单元格时,就会执行环绕(在while循环中)。这在一秒钟内执行了数千次。有没有办法使用一些查找或其他方式来优化它。 MAX_ROWS和MAX_COLS可能不是2的幂。

CONNECT_BY_ISLEAF = 1

2 个答案:

答案 0 :(得分:1)

您可能对使用余数进行除法的概念感兴趣,通常将其余部分实现为a % b

因此

return data[newCellIndex.rowId % MAX_ROWS][newCellIndex.colId % MAX_COLS];

之前不需要while循环。

根据评论,如果在每个查询中完成,则余数计算中的隐含整数除法成本太高。假设m_matrixOffset在大量查询中保持不变,请使用余数运算减少其坐标。然后newCellIndex小于最大值的两倍,因此最多只需减少一次。因此,将while替换为if是安全的,可以省略一次比较。

如果你可以为空间牺牲记忆,那么将矩阵尺寸加倍并用重复的矩阵元素填充多余的条目。更新矩阵时,您必须确保此模式成立。

然后,再次假设m_matrixOffsetCellIndex都在行和列的最大值内,您可以访问扩展矩阵的单元格而不进一步减少。这将是“查找表”理念的变体。

或者使用真实的查找表,但是然后执行3个数组单元格查找,如

return data[repeatedRowIndex[newCellIndex.rowId]][repeatedColIndex[newCellIndex.colId]];

答案 1 :(得分:1)

这取决于包裹相对于矩阵是小还是大。

最常见的情况是您需要的只是最近邻居。因此,将矩阵N + 2乘以M + 2并复制包裹。这使得读取速度很快,但写得有点繁琐(通常是一个很好的权衡)。

如果这不好,请专门化这些功能。找出哪些单元格是边缘单元格并专门处理(你必须能够做到这一点比简单地将逻辑硬编码到访问中更便宜,当然,如果只有一个或两个单元格会改变每个通道将保持,不是如果你每次传递都会生成一个随机列表。