将3维数组转换为2维数组

安德鲁·辛普森

我有这个字节数组:

byte[,,] somedata = new byte[100,150,3];
~somedata is now populated by an external input.

我只想在其中使用这些值:

byte[,] useThisDataOnly = new byte[100,150];

目前,我使用这个:

foreach (int x=0,x< 100; x++)
{
    foreach (int y=0,y< 150; y++)
    {
       useThisDataOnly [x,y] = somedata[x,y,0];
    }
}

有没有更快的方法可以做到这一点?

另外,我将把这个useThisDataOnly扁平化(据我所知,它的处理速度更快)。

有什么建议?

马修·沃森(Matthew Watson)

优化这一点的困难在于,要忽略的字节位于最“快速移动”的索引中。

我的意思是:如果像这样将连续的数字分配给每个数组元素:

byte[,,] source = new byte[100, 150, 3];

for (int i = 0, n = 0; i < 100; ++i)
    for (int j = 0; j < 150; ++j)
        for (int k = 0; k < 3; ++k, ++n)
            source[i, j, k] = unchecked ((byte)n);

如果按展平的顺序打印内容,将得到0..255重复。

然后,您排除最终尺寸:

for (int i = 0; i < 100; ++i)
    for (int j = 0; j < 150; ++j)
        dest[i, j] = source[i, j, 0];

如果按展平的顺序打印结果,将得到:

0, 3, 6, 9, 12, 15, ...

因此,您可以看到为了将输入转换为输出,您需要占用每个第三个字节,但是不幸的是,没有快速的方法可以做到这一点。

但是,如果您能够要求创建的数组首先要省略索引:

byte[,,] source = new byte[3, 100, 150];

这样您可以使用了Buffer.BlockCopy()

我猜这不是一个选择-否则,手工编码的循环可能是最快的方法,而无需求助于不安全的代码。

不安全的代码

这是使用不安全的代码和指针的方法。这甚至可能无法使其更快,因此在选择执行此操作之前,您需要(a)确保执行简单的方法确实太慢,并且(b)对发布版本的使用Stopwatch进行一些仔细的计时以确保它确实值得使用不安全的代码。

还应注意使用不安全代码的弊端!不安全的代码需要提升的权限,并且可能导致您的程序因低级C ++风格的野生指针错误而崩溃!

using System;
using System.Diagnostics;

namespace Demo
{
    internal static class Program
    {
        static void Main()
        {
            byte[,,] source = new byte[100, 150, 3];

            for (int i = 0, n = 0; i < 100; ++i)
                for (int j = 0; j < 150; ++j)
                    for (int k = 0; k < 3; ++k, ++n)
                        source[i, j, k] = unchecked ((byte)n);

            byte[,] dest1 = new byte[100, 150];
            byte[,] dest2 = new byte[100, 150];

            for (int i = 0; i < 100; ++i)
                for (int j = 0; j < 150; ++j)
                    dest1[i, j] = source[i, j, 0];

            unsafe
            {
                fixed (byte* sp = source)
                fixed (byte* dp = dest2)
                {
                    byte* q = dp;
                    byte* p = sp;

                    for (int i = 0; i < 100*150; ++i)
                    {
                        *q++ = *p;
                        p += 3;
                    }
                }
            }

            for (int i = 0; i < 100; ++i)
                for (int j = 0; j < 150; ++j)
                    Trace.Assert(dest1[i, j] == dest2[i, j], "Arrays should be identical");
        }
    }
}

我个人认为使用简单,安全的循环不会太慢,但是现在至少您可以尝试一些代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将一维数组转换为二维数组

来自分类Dev

将一维数组转换为二维数组

来自分类Dev

将二维数组转换为单维数组

来自分类Dev

将一维数组转换为二维数组

来自分类Dev

将一维数组转换为二维数组

来自分类Dev

将多个二维数组转换为一个3维数组

来自分类Dev

将3维Numpy数组转换为4维Numpy数组

来自分类Dev

在保持网格顺序的同时将2维数组转换为1维数组

来自分类Dev

将n维numpy数组转换为2维索引数组

来自分类Dev

将mysqli查询结果转换为2维数组

来自分类Dev

将一维“多维”数组转换为一维

来自分类Dev

将一维“多维”数组转换为一维

来自分类Dev

使用PYTHON将3维DataFrame转换为3维数组的问题

来自分类Dev

将嵌套数组转换为一维数组

来自分类Dev

将元组数组转换为二维数组

来自分类Dev

将一维数组转换为多维数组

来自分类Dev

在Swift3中将一维数组转换为二维数组的效率如何

来自分类Dev

将一维“扁平化”索引转换为N维数组的N维矢量索引

来自分类Dev

将3维字节数组转换为单字节数组

来自分类Dev

错误:将3D Matlab数组转换为0维np数组

来自分类Dev

将JSON二维数组转换为AS3数组

来自分类Dev

根据Python中的变量将n维numpy数组转换为2D数组

来自分类Dev

将某些值从二维数组转换为一维数组

来自分类Dev

将一维字符串数组转换为二维浮点数组

来自分类Dev

将一维数组转换为9列的二维数组

来自分类Dev

JavaScript:将一维数组按给定大小转换为二维数组

来自分类Dev

C++,将一维数组转换为二维数组

来自分类Dev

SystemVerilog:将两个一维数组转换为二维数组

来自分类Dev

将二维字符串数组转换为二维数组

Related 相关文章

热门标签

归档