【问题标题】:Circular sliding window over 2 dimensional array algorithm二维数组算法上的圆形滑动窗口
【发布时间】:2012-02-15 23:41:34
【问题描述】:

This question solves half of my problem 因为我的滑动窗可以移到桌子外面, 例如对于 3x3 窗口,窗口的两列可以在表格的左端 一列将在右端。这些图像显示窗口向左移动

我需要这个滑动窗口的算法,上述问题中的滑动窗口不会移到表格之外。

【问题讨论】:

  • 对我的问题投反对票的人可以告诉我他们为什么这样做吗?
  • 我不同意你的观点,Henk,圆形滑动窗口是一个单独的问题/问题。
  • 所以 Stackoverflow“帮助者”删除了他们的 cmets,因为,我想,现在这个问题是准确的。您能否也删除您的反对票,以便其他人可以找到此解决方案?

标签: c# algorithm sliding-window


【解决方案1】:

您可以使用模运算 (%) 来限制索引。

Size arraySize = new Size(20, 15);
Size windowSize = new Size(3, 3);

double[,] array = new double[arraySize.Width, arraySize.Height];

// Set the location of the window
Point windowLocation = new Point(18, 14);

for (int x = 0; x < windowSize.Width; x++) {
    for (int y = 0; y < windowSize.Height; y++) {
        DoSomethingWith(array[(windowLocation.X + x) % arraySize.Width,
                              (windowLocation.Y + y) % arraySize.Height]);
    }
}

【讨论】:

  • 感谢 Olivier 的解决方案。您的代码中有一个错误,应该使用数组大小​​而不是窗口大小来取模。
  • @robert_d:谢谢你的提示,当然,你是对的。修好了。
【解决方案2】:

我会在您的 2D 对象周围创建一个适配器,它截取请求的窗口位置,咨询底层 2D 对象,并返回一个适当构造的结果。这样您就可以使用任何底层实现(例如您链接到的那个)并获得所需的结果。

考虑以下伪代码:

View getView(int leftX, int topY) {
    if (leftX >= 0 and
        topY >= 0 and
        leftX <= underlying.width() - viewWidth and
        topX <= underlying.height() - viewHeight)
    {
        return underlying.getView(leftX, topY);
    }
    // else make your own view and populate it
    View view = new View()
    for (int i = 0; i < viewWidth; ++i)
        for (int j = 0; j < viewHeight; ++j)
            view.set(i, j) = underlying.get((leftX + i) % underlying.width(), (topY + j) % underlying.height())
}

如果您最终使用此代码,请确保负索引模数得出正结果。如果没有,请使用viewWidth - negative_modulo 获取正确的索引。

【讨论】:

  • 你能说得更具体些吗?
  • 如果没有为您编写完整的解决方案,我不能比这更具体......基本上,underlying 是实现滑动窗口而不是循环的“基础”实现。因此,如果可以的话,您可以直接使用该实现(不需要包装窗口的位置),否则,您可以制作自己的视图并使用“包装”数据“手动”填充它。 View 实现了“窗口”的概念。
  • 我只是扔掉了一些简单的、工作的Python code,它演示了这个原理。它不是 C#,但 Python 将 非常好 读取为伪代码。如果你能运行它,它就会工作。看看它是否有帮助。
猜你喜欢
  • 1970-01-01
  • 2015-12-16
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 2010-11-14
相关资源
最近更新 更多