处理矩阵边的正确方法
Correct way of handling edges of a matrix
假设我们要写一个简单的变换矩阵的程序。每个元素应该是其相邻元素的和。
考虑到矩阵的边,什么是"正确的"(即最常见的,最好的可读性,最有效的)方法?
我能想到的两种明显的方法:
- 首先处理角(4条单独的线),使用4个循环来处理剩余的边缘,然后使用标准循环来处理其余的
- 使用一个循环与
if
的整个矩阵来检查我们是否在中间或它是一个边缘情况。
第一个更快(我猜),但对我来说它看起来有点像4行加5个循环。
有更优雅的方式吗?我将其标记为c++,因为我目前正在用c++编码,并且我感觉三元运算符?:
将派上用场,可以编写一个可爱的解决方案。
如果你的解决方案可以调整为更复杂的规则(不只是查找一个上/右/左/下单元格,但如果你正在做某种递归)。但我不确定这是否会改变很多。
一种优雅的方法是使用一个更大的矩阵。如果您的矩阵有NxM元素,创建一个临时的(N+2)x(M+2)矩阵,用零填充,然后像这样复制您的值:
temp(i+1,j+1) <</p>
现在你实际上得到了原始矩阵,它周围的边为零。现在可以安全地计算临时矩阵中所有非边缘单元格的所有邻居的和。结果将是您最初寻找的矩阵。
注意-这将比你提出的直接的五循环解决方案效率低。
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 处理从列表中删除指向对象的指针的"healthy"方法是什么?
- 哪种方法更适合处理虚拟析构函数?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- Tesseract/Lebonica处理单页和多页图像的正确方法
- 在 if 语句中处理多个 or 的更优雅的方法是什么
- Java(或C++)如何处理接口中定义的方法的调用
- 以C++读取文件并处理可能的错误的便携式方法
- 是否有可以处理方法调用依赖关系的设计模式?
- 如何将信号处理程序添加为方法
- 在2018年使用C++处理Unicode的正确方法是什么?