【发布时间】:2013-01-19 01:18:15
【问题描述】:
给定一个由 M 行和 N 列组成的矩阵,并分配为 M*N 元素的字节数组(这些元素最初设置为零),我会根据以下规则修改此矩阵:在某个元素附近找到的元素必须设置为给定值。换句话说,给定一个矩阵,我应该设置矩阵的一个区域:为此我应该访问数组的不连续部分。
为了执行上述操作,我可以访问以下信息:
- 指向位于邻域中心的元素的指针(在上述操作期间不得更改此指针);还提供了该元素的位置(行和列);
- 邻域的大小
L*L(L 始终为奇数)。
实现这个操作的代码应该在 C++ 中尽可能快地执行:出于这个原因,我想到了使用上面的指针来访问数组的不同部分。相反,邻域中心元素的位置(行和列)可以让我检查指定区域是否超过矩阵的维度(例如,区域的中心可能位于矩阵的边缘) :在这种情况下,我应该只设置位于矩阵中的那部分区域。
int M = ... // number of matrix rows
int N = ... // number of matrix columns
char* centerPtr = ... // pointer to the center of the region
int i = ... // position of the central element
int j = ... // of the region to be modified
char* tempPtr = centerPtr - (N+1)*L/2;
for(int k=0; k < L; k++)
{
memset(tempPtr,value,N);
tempPtr += N;
}
如何改进代码? 如何处理一个区域可能超过矩阵维度的事实? 如何让代码在执行时间上更高效?
【问题讨论】:
-
强制性问题:您是否进行了分析以确认这是一个问题?
-
不,但我很想看看优化代码和非优化代码之间的区别。注意:我上面列出的代码没有处理一个区域可能超过矩阵的维度这一事实,因为我不知道如何使用指针来处理这个问题。
-
如果您真的想要“尽可能快”的代码,您可能需要为将要运行的平台/设备编写一些手动优化的程序集。我猜这不是你想要的。
-
@tc:你说得对,但我的意思是在 C++ 中“尽可能快”......我认为使用指针,代码比使用两个嵌套循环快一点。这是因为我想在使用指针和使用两个嵌套循环之间进行速度比较。
-
警告!指针算术取决于底层类型,因此行
tempPtr += N;将向前移动tempPtrNchars,而不是 Nints you'重新期待。为什么不直接使用int*?
标签: c++ performance algorithm