【发布时间】:2016-01-28 16:17:49
【问题描述】:
我有一个大约 250、250 维度的二维数组自定义向量类。 Vector 类只存储向量的 x 和 y 浮点分量。我的项目要求我对数组执行平滑函数,以便通过获取数组中每个向量周围 i 索引的局部平均值来创建一个新数组。我的问题是我当前的解决方案计算速度不够快,想知道是否有更好的计算方法。
我当前解决方案的伪代码如下所示。我在 C# 中实现这个,任何帮助将不胜感激。我的实际解决方案使用一维数组来加快速度,但我没有在此处包含它。
function smoothVectorArray(Vector[,] myVectorArray, int averagingDistance) {
newVectorArray = new Vector[250,250];
for (x = 0; x < 250; x++)
{
for (y = 0; y < 250; y++)
{
vectorCount = 0;
vectorXTotal = 0;
vectorYTotal = 0;
for (i = -averageDistance; i < averagingDistance+ 1; i++)
{
for (j = -averageDistance; j < averagingDistance+ 1; j++)
{
tempX = x + i;
tempY = y + j;
if (inArrayBounds(tempX, tempY)) {
vectorCount++;
vectorXTotal += myVectorArray[tempX, tempY].x;
vectorYTotal += myVectorArray[tempX, tempY].y;
}
}
}
newVectorArray[x, y] = new Vector(vectorXTotal / vectorCount, vectorYTotal / vectorCount);
}
}
return newVectorArray;
}
【问题讨论】:
-
我唯一能看到的是你正在访问 myVectorArray[tempX, tempY] 2 次,你应该将它存储在一个局部变量中以便更快地访问。
-
靠近边缘时可能会减少内部循环
for(tempX = Math.Max(x-averageDistance, 0); tempX < Math.Min(x + averageDistance, 249); tempX++) -
您的代码包含拼写错误(
averageDistancevsaveragingDistance)。发布代码时使用复制/粘贴,不要重新输入。 -
inArrayBounds是不必要的,修改内部循环以防止尝试转到数组之外(提示:在设置循环开始和结束时使用max和min)。
标签: c# arrays performance 2d average