3

として宣言された 2D 配列がありnew byte[w, h]ます。座標を指定して、この配列のサブセクションを切り取りたいと思います(x1,y1)- (x2,y2)。これを行う最も簡単な方法は何ですか? 2D 配列を「スライス」する方法はありますか?

4

2 に答える 2

1

より速い方法を思いつくことはできませんが、2 つのネストされたループを使用できます。

byte[,] array2 = new byte[x2 - x1, y2 - y1];
for (int i = x1; i < x2; i++)
{
    for (int j = y1; j < y2; j++)
    {
        array2[i-x1, j-y1] = array[i, j];
    }
}

ジャグ配列の場合、linq クエリを使用できます。

IEnumerable<byte> x = array3.Skip(x1)
                            .Take(x2-x1)
                            .SelectMany(a => a.Skip(y1).Take(y2-y1));
于 2013-05-21T03:43:14.350 に答える
1

Array.Copyを使用できます:

int w2 = x2 - x1 + 1;
int h2 = y2 - y1 + 1;
byte[,] array2 = new byte[w2, h2];
for (int i = 0; i < w2; i++)
{
    Array.Copy(array1, (i+x1)*h + y1, array2, i*h2, h2);
}

これは、大きな配列の場合は高速になる場合があります。ただし、ネストされた 2 つのループの方が読みやすいです。

于 2013-05-21T08:34:13.447 に答える