【问题标题】:Copying part of a Multidimentional Array into a smaller one将多维数组的一部分复制到一个较小的数组中
【发布时间】:2011-07-25 07:29:07
【问题描述】:

我有两个这样声明的多维数组:

bool?[,] biggie = new bool?[500, 500];
bool?[,] small = new bool?[100, 100];

我想将大的部分复制到小的部分。假设我想要从索引 100 到 199 水平和 100 到 199 垂直。

我写了一个简单的 for 语句,如下所示:

for(int x = 0; x < 100; x++)
{
    For(int y = 0; y < 100; y++)
    {
        Small[x,y] = biggie[x+100,y+100];
    }
}

我在我的代码中经常这样做,这已被证明是主要的性能干扰。

Array.Copy 仅复制单维数组,而对于多维数组,它只是将整个矩阵视为单个数组,将每一行放在另一行的末尾,这不允许我剪切我的数组中间的一个正方形。

有没有更有效的方法来做到这一点?

Ps.:我确实考虑重构我的代码以便根本不这样做,并且对更大的数组做任何我想做的事情。复制矩阵不可能是无痛的,关键是我之前已经偶然发现了这个,寻找答案,但没有得到。

【问题讨论】:

    标签: c# .net arrays performance multidimensional-array


    【解决方案1】:

    根据我的经验,有两种方法可以有效地做到这一点:

    • 使用不安全的代码并直接使用指针。
    • 将二维数组转换为一维数组,并在需要将其作为二维数组访问时执行必要的运算。

    第一种方法很难看,它使用了可能无效的假设,因为不能保证二维数组在内存中连续布局。第一种方法的结果是您不必更改已经使用二维数组的代码。第二种方法与第一种方法一样有效,不会做出无效的假设,但确实需要更新您的代码。

    【讨论】:

    • 第二种方法是否涉及使用 Array.Copy 并获得 100 到 199、500 到 699 等等?我正在考虑它..至于指针,我会检查一下,我对此不太了解..谢谢!
    • 我认为 Eric 的意思是创建一维数组,例如 int[] array = new int[width * height];并通过简单的算术访问其中的元素: array[y * width + x]; (对于逐行数组)或 array[x * height + y]; (按列)。一维数组比 c# 中的多维数组快得多,你可以阅读更多关于它的信息。这里:stackoverflow.com/questions/468832/…
    • @Ravadre,是的,我就是这个意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2019-12-30
    相关资源
    最近更新 更多