Generowanie wypełnionej macierzy/tablicy

Generowanie wypełnionej macierzy/tablicy
WO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Piszę program w C++, w którym potrzebuję wygenerować macierz(tablicę) o rozmiarze 1 kolumny i x wierszy, która będzie zawierać 0 i 1, w podanych przez siebie przedziałach.

W matlabie to wygląda tak:

Kopiuj
[ones((m*n)/(2*m),1);zeros((m*n)-(m*n)/m,1);ones((m*n)/(2*m),1)]

gdzie mam dla zobrazowania następujący przypadek: m=8000, a n=2. Utworzy mi macierz o 8 tysiącach wierszy, które będą zapełnione od elementu 1 do 2000 wartością 1, od 2001 do 6000 wartością 0, od 6000 do 8000 znów wartością 1.

Czy jest znacie jakąś prosty sposób na generowanie takiej macierzy?

Bartosz36
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 348
0

1. Wygenerowanie samej macierzy to nie jest problem, możesz użyć std::array, który zawierać będzie tablicę o rozmiarze 1, lub kolejne std::array.
Kiedyś @kq utworzył prosty widok na taką macierz, możesz z tego skorzystać.
2. Wypełnienie takiej macierzy zależy od tego, czy możesz te przedziały "zahardkodować", lub utworzyć funkcję, która o takie przedziały zapyta użytkownika lub odczyta je z pliku. Wtedy pozostaje takie dane przeparsować i utworzyć funkcję, która te przedziały zastosuje i uzupełni tablicę iterując po kolejnych wierszach.

Potat0x
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 372
1

Skleciłem takie coś dla relaksu:

Kopiuj
#include <iostream>
#include <vector>
#include <array>

using namespace std;

/*
    size - rozmiar wynikowego wektora
    default_value - wartość domyślna elementów wektora
    initializer_list - lista przedziałów i wartości w postaci {start, ile_w_przedziale, wartość}
*/
vector<int>vector_gen(int size, int default_value, initializer_list<array<int, 3>> ranges)
{
    vector<int> v (size, 0);
    for(auto it = ranges.begin(); it != ranges.end(); ++it)
    {
        int start = (*it)[0];
        int end = (*it)[1];
        int value = (*it)[2];

        fill(v.begin()+start, v.begin()+end, value);
    }
    return v;
}

int main()
{
    int size = 20;
    int default_val = 0;

    vector<int> vec = vector_gen(size, default_val, {{0, 3, 9}, {10, 11, 8}, {15, 20, 7}});

    for (auto v:vec)
    {
        cout<<v<<", ";
    }
    cout<<endl;
}

Kopiuj
9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 7, 7, 7, 7, 7,

Wadą jest kopiowanie wektora (ale to można łatwo zmienić).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.