繁体   English   中英

将较小的n维数组放入较大的n维数组的最快方法(二维图形比喻:在画布上绘制矩形)

[英]Fastest way to put a smaller n-dimensional array in a bigger one (2d graphical analogy: paint rectangle on canvas)

说我有这个10x5阵列:

..........
..........
..........
..........
..........

和这个1x2数组:

AB
CD
EF

现在,我想将第二个数组写入位置1/2(X-pos / Y-pos)较大的数组中,删除所有旧值(我的示例是基于零的值(包括零)。 结果将是:

..........
..........
.AB.......
.CD.......
.EF.......

可能有多个子数组具有已知的覆盖层次结构,这些数组可能具有3个以上的维度,并且这些数组包含复杂的对象。

在C#中是否有最佳做法?
有语言不可知的解决方案吗?

好的,即使取消边界检查, Buffer.BlockCopy的速度也比逐字节复制数据快得多。 有趣的是,似乎Buffer.BlockCopy实际上可以在2D数组上工作:)

因此,您可能想尝试这样的事情:

byte[,] source = new byte[1000, 100];
byte[,] dest = new byte[2048, 2048];

int offsetX = 100;
int offsetY = 20;

int width = source.GetLength(0);
int height = source.GetLength(1);

for (int y = 0; y < height; y++)
{
  Buffer.BlockCopy
  (
    source, y * height, 
    dest, offsetX + dest.GetLength(1) * (y + offsetY), 
    width
  );
}

基本上,假设该数组是一个字节数组,其中X是第一个索引,Y是第二个索引,那么我一次要遍历一行,将整个行从源一次删除到dest。

这似乎比一次简单地复制一个字节快得多,所以我认为它实际上确实使用DMA而不是使用CPU复制字节。

请注意,只有在行足够长的情况下,这才会更快。 如果要复制单列,则可能比仅逐字节复制要慢。 如果您发现复制列的次数多于行的数目(即, width通常小于height ),则可能需要考虑将坐标反转。 交换X和Y。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM