Generowanie wypełnionej macierzy/tablicy

Odpowiedz Nowy wątek
2019-04-06 12:19
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:

[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?

edytowany 1x, ostatnio: wojtaszkiewicz, 2019-04-06 12:20
Zrób se klasę Matrix w której utworzysz proste metody.. Wystarczy, że stworzysz metody np. createi fill. create stworzy Ci wektor, a fill go wypełni, choć nic nie stoi na przeszkodzie, żeby w create dodać wypełnianie. - PrezesiQ 2019-04-06 12:52
A potem wypełnianie takiej macierzy od x do y, od u do v etc jest proste - PrezesiQ 2019-04-06 12:53

Pozostało 580 znaków

2019-04-06 12:52
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.

Pozostało 580 znaków

2019-04-06 13:49

Skleciłem takie coś dla relaksu:

#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;
}
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ć).

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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