c# - 复制 C# 多维数组元素的最有效方法是什么?

标签 c# optimization multidimensional-array copy

在 C# 中从一个多维数组复制到另一个多维数组时,嵌套循环的最有效方法是什么?每个数组的上限和下限都不同,所以我认为 Array.Copy() 不会为我完成这项工作。我目前有以下内容:

for (int x = lower.X; x <= upper.X; x++)
{
    for (int y = lower.Y; y <= upper.Y; y++)
    {
        for (int z = lower.Z; z <= upper.Z; z++)
        {
            copy[x, y, z] = Elements[x, y, z];
        }
    }
}

这是一个相对低级的优化,那么编译器会为我处理这个吗?当目标具有不同的上限和下限时,是否有更好的方法来复制多维数组的元素?

最佳答案

Array.Copy 将为您工作,但仅用于替换最内层的循环。您将不得不自己计算源和目标索引,但这当然是可行的。 documentation for Array.Copy(Array, Int32, Array, Int32, Int32)说明如何对索引进行数学运算,以便您可以指定源位置和目标位置。

我强烈建议在任何需要使用它的地方使用 Array.Copy,因为它非常快。他们做了一些认真的 assembler-foo 以使其运行良好。

更新

我不确定这有多接近正确,因为我还没有尝试过,但我认为它可能会这样:

int xLength = upper.X - lower.X + 1;
int yLength = upper.Y - lower.Y + 1;
int zLength = upper.Z - lower.Z + 1;

Array copy = Array.CreateInstance(Elements.GetType(), new { xLength, yLength, zLength }, new {lower.X, lower.Y, lower.Z});

int skippedX = lower.X - Elements.GetLowerBound(0);
int skippedY = lower.Y - Elements.GetLowerBound(1);
int skippedZ = lower.Z - Elements.GetLowerBound(2);

int sourceDim0Size = Elements.GetLength(1) * Elements.GetLength(2);
int sourceDim1Size = Elements.GetLength(2);

for (int x = 0; x < xLength; x++)
{
     for (int y = 0; y < yLength; y++)
     {
         int destinationIndex = x * yLength * zLength + y * zLength;
         int sourceIndex = (x + skippedX) * sourceDim0Size 
                           + (y + skippedY) * sourceDim1Size
                           + skippedZ;
         Array.Copy(Elements, sourceIndex, copy, 0, zLength);
     }
} 

关于c# - 复制 C# 多维数组元素的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5655553/

相关文章:

c - 这段代码究竟指向哪个数组条目?

c# - 在 C# 的 OpenXml SDK 中使用 MergeField FieldCodes 时,为什么字段代码会消失或碎片化?

c# - 单声道上的 Winforms 数据绑定(bind)和 INotifyPropertyChanged

c# - 在 mvc 中使用 dapper 的动态结果

swift - 我的滚动虽然通常很顺利,但有时会很不稳定

python - 字典的 Numpy 数组

c# - Monodevelop 中的 MySQL ASP.NET MVC

multithreading - 当线程数翻倍时,我的矩阵乘法程序需要四倍的时间

optimization - OpenGL - glBindTexture - 过早优化?

c++ - 数组地址的地址