Kopiowanie fragmentu pamięci i iteracja tablicy

0

Cześć, mam tablicę float teoretycznie 3D, w praktyce, to: [x, y, 0].
x i y <0, 99>

Takich tablic jest 8(w jednym obiekcie). Chcę to wszystko zapisać ciągiem do jednego bufora:

unsafe
            {
                byte[] s = new byte[sizeof(float)*8* 100 * 100];
                byte[] buffer = new byte[sizeof(float)* 100 * 100];
            
                for (int i = 0; i < 8; i++)
                {
                    fixed (float* p = &er.EigenImages[i].Data[0, 0, 0]) //początek itej tablicy
                     {
                        IntPtr ptr = (IntPtr)p;
                        Marshal.Copy(ptr, buffer, 0, buffer.Length);
                    }

                    Array.Copy(buffer, 0, s, sizeof(float) * i * 100 * 100, buffer.Length);
                }

Tak to wg mnie powinno wyglądać. No, tylko jest pewien problem.
Gdy zapisuję taki bufor na dysk, utworzony plik ma odpowiedni rozmiar(320 000 B), ale ostatnie 40 000B to zera(NULL). Tymczasem w żadnej tablicy nie ma żadnego zera.
Co dziwniejsze, jeśli tworzę sobie bufor w iteracji:

float[] vectors = new float[8 * 100* 100];
int sum = 0;

for (int i = 0; i < 8; i++) //dla każdej tablicy
{
        for (int j = 0; j < 100; j++) //każdy row
                for (int k = 0; k < 100; k++) //każda kolumna
                {
                        vectors[sum] = er.EigenImages[i].Data[j, k, 0];
                        sum++;

                }
}

to jest to samo. Czy ja coś tu robię źle, czy czegoś nie rozumiem?

Zapis do pliku:

//bufor z iteracji
using (BinaryWriter bw = new BinaryWriter(File.Open("D:\\test.bin", FileMode.Create)))
                {
                    foreach(float f in vectors)
                    {
                        bw.Write(f);       
                    }

                    bw.Close();
                }

//bufor z kopiowania pamięci:
using (BinaryWriter bw = new BinaryWriter(File.Open("D:\\test_str.bin", FileMode.Create)))
                {
                    bw.Write(s);
                    bw.Close();
                }
0

byte[] s = new byte[sizeof(float)8 100 * 100];

pierwsze WTF: dlaczego tworzysz tablicę bajtów, skoro potrzebujesz tablicy floatów? utrudniasz sobie indeksowanie, i narażasz się na błędy. tak się nie robi.

Co dziwniejsze, jeśli tworzę sobie bufor w iteracji:

to jest to samo. Czy ja coś tu robię źle, czy czegoś nie rozumiem?
lepiej sprawdź, czy dane w Data są prawidłowe dla wszystkich EigenImages.

zanim zaczniesz grzebać we wskaźnikach, proponuję doprowadzić do działania kod na normalnych tablicach.

EDIT: poza tym, jeśli tablica Data nie byłaby trójwymiarowa tylko zagnieżdżona (Data[j][k][0] zamiast Data[j,k,0], albo nawet Data[j,k][0]) to można kopiować za jednym zamachem całe wiersze i będzie to znacznie szybsze niż kopiowanie danych przez wskaźniki.

0
Azarien napisał(a)

byte[] s = new byte[sizeof(float)8 100 * 100];

pierwsze WTF: dlaczego tworzysz tablicę bajtów, skoro potrzebujesz tablicy floatów? utrudniasz sobie indeksowanie, i narażasz się na błędy. tak się nie robi.

Potrzebuję po prostu dokładną kopię tablicy wpisać w inne miejsce - jako jeden ciąg bajtów.

Co dziwniejsze, jeśli tworzę sobie bufor w iteracji:

to jest to samo. Czy ja coś tu robię źle, czy czegoś nie rozumiem?
lepiej sprawdź, czy dane w Data są prawidłowe dla wszystkich EigenImages.
</quote>
Co znaczy "prawidłowe"?

zanim zaczniesz grzebać we wskaźnikach, proponuję doprowadzić do działania kod na normalnych tablicach.

To jest zwykła iteracja. Albo mam gorączkę, albo zadziały się rzeczy, o których istnieniu nie mam pojęcia. Dlatego piszę. No nie sądzę, że można się walnąć w iterowaniu tak prostej tablicy :P

EDIT: poza tym, jeśli tablica Data nie byłaby trójwymiarowa tylko zagnieżdżona (Data[j][k][0] zamiast Data[j,k,0], albo nawet Data[j,k][0]) to można kopiować za jednym zamachem całe wiersze i będzie to znacznie szybsze niż kopiowanie danych przez wskaźniki.

Nie wiem, co mam Ci powiedzieć. W jaki sposób kopiowanie wierszy tablicy ma być szybsze od kopiowania ciągu pamięci? Zaznaczam, że w C#(w ogóle w .NET) dopiero kilka dni programuję :)

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