zamiana tablicy Byte[,] na Byte[] oraz Byte[] na Byte[,]

0

Takie moje poczatki z C# (przesiadka z Delphi)

Jak zamienić tablice dwu wymiarowa na jedno wymiarowa ?
Chodzi mi o rozwiazanie najmniej obciazajace CPU

Najszybsze bedzie przepisanie ?

Byte[,] daneIN;
int RozmiarOUT=daneIN.GetLength(0)*daneIN.Getlength(1);
Byte[] daneOUT= new Byte[RozmiarOUT];

int index=0;
for(int y=0; y<daneIN.GetLength(0);y++)
{
  for(int x=0; x<daneIN.GetLength(1);x++)
  {
      daneOUT[index] = daneIN[x,y];
      index++;
  } 
  
}
0

Istnieje bardzo wiele sposobów reprezentacji tablicy dwuwymiarowej w o jednym wymiarze mniej, np.:

1 2 3
4 5 6 --> 1 2 3 4 5 6 7 8 9
7 8 9
1 2 3
4 5 6 --> 1 4 7 2 5 8 3 6 9
7 8 9
1 2 3
4 5 6 --> 1 5 9 4 8 2 6 7 3
7 8 9

i tak dalej, i tak dalej - który Cię interesuje?

0

Ta zaproponowana "trzecia" metoda to co to za magiczne ułożenie ?

**Przemyślałem temat i poprawiłem tytuł bo w sumie interesuje mnie zamiana w obie strony :)
**
Co do mojego problemu to mam dwu-wymiarowe dane które zapisuje do pola BLOB w bazie danych , potem te same dane wczytuje z bazy i wpisuje do dwu-wymiarowej tablicy.
Wiec ułożenie danych w tablicy z jednym wymiarem nie jest dla mnie istotne, najważniejsza jest szybkość

Musze tylko mieć kompatybilne metody na zapisywanie i odczytywanie danych byte[,]-->byte[] oraz byte[] --> byte[,]

0

Ta zaproponowana "trzecia" metoda to co to za magiczne ułożenie ?

Trochę po przekątnych, trochę inaczej ;-)

Co do mojego problemu to mam dwu-wymiarowe dane które zapisuje do pola BLOB w bazie danych , potem te same dane wczytuje z bazy i wpisuje do dwu-wymiarowej tablicy.

Ile masz tych danych?

Btw, dwuwymiarowej*.

0

256 klatek obrazu 1024x1024 U8
i to pakuje do SqLite

Trochę może pokutuje u mnie przekonanie ze .NET jest wolniejszy niż natywny kod wiec może przesadzam z optymalizacja :)

Jak są zorganizowane dane w pamieci RAM dla byte[,] ?
To jest jakis ciagły kawałek pamieci i majac wskaźnik do pierwszego elementu tablicy mogę odczytać całe dane ?

0
Adamek Adam napisał(a):

Jak są zorganizowane dane w pamieci RAM dla byte[,] ?

byte[,] to dwuwymiarowa tablica. dane są w ciągłym kawałku pamięci.

byte[][] to tablica tablic.

majac wskaźnik do pierwszego elementu tablicy mogę odczytać całe dane ?

Tak, ale .NET to managed code (kod zarządzany) i takie bezpośrednie mieszanie w pamięci przez wskaźniki nie jest często potrzebne.

    class Program
    {
        static unsafe void Main()
        {
            byte[,] tab = new byte[2, 2];
            fixed (byte* p = &tab[0, 0])
            {
                p[3] = 4;
            }
            System.Console.WriteLine(tab[1,1]); // 4
        }
    }
0

Ale tu nie trzeba kombinować ze wskaźnikami, można do tego użyć całkiem wydajnych metod z frameworka.

byte[,] a = new byte[,] { { 1, 2, 3 }, { 4, 5, 6 } };
byte[] b = new byte[6];

Buffer.BlockCopy(a, 0, b, 0, a.GetLength(0) * a.GetLength(1) * sizeof(byte));

byte[,] c = new byte[2, 3];

Buffer.BlockCopy(b, 0, c, 0, a.GetLength(0) * a.GetLength(1) * sizeof(byte));

1 użytkowników online, w tym zalogowanych: 0, gości: 1