Matrix mit Zahlen füllen



  • Hallo,
    würde gerne zwei Matrizen mit Zufallszahlen füllen:

    double a[N][N];
    double b[N][N];
    double c[N][N];
    

    in c soll das Ergebnis später stehen. Weis jemand wie ich a und b füllen kann?



  • @lauriMo sagte in Matrix mit Zahlen füllen:

    Weis jemand wie ich a und b füllen kann?

    Ja. *scnr*

    std::uniform_real_distribution<double> gibt dir pseudozufällige doubles und mit std::generate() kann man toll arrays füllen.



  • Danke für die schnelle Hilfe.
    Bin mir mit der Verwendung nicht ganz sicher:

    double a[N][N],b[N][N],c[N][N];
    std::uniform_real_distribution<double>
    std::generate(a);
    std::generate(b);
    

    so`?


  • Mod

    @lauriMo sagte in Matrix mit Zahlen füllen:

    Danke für die schnelle Hilfe.
    Bin mir mit der Verwendung nicht ganz sicher:

    double a[N][N],b[N][N],c[N][N];
    std::uniform_real_distribution<double>
    std::generate(a);
    std::generate(b);
    

    so`?

    Na, offensichtlich nicht, denn du hast das doch sicher ausprobiert und gesehen, dass das nicht ansatzweise compiliert. Außerdem ist hier doch nicht einmal eine logische Verbindung zwischen der Distribution und dem Generator; das ist doch nur alle Begriffe von Swordfish planlos in ein Programm geschrieben und gehofft. Vielleicht solltest du wenigstens mal die Links lesen, die Swordfish dir gegeben hat? Da sind viele Beispiele dahinter...



  • super danke. hab garnicht gesehen das da links waren 😳



  • Ja, die blauen Dinger im Fließtext kann man anklicken ;-p

    Starthilfe weil 2d-array:

    #include <cstddef>    // std::size_t
    #include <iterator>   // std::ostream_iterator<>
    #include <iostream>   // std::cout
    #include <random>     // std::random_device, std::uniform_real_distribution<>
    #include <algorithm>  // std::copy<>(), std::generate<>()
    
    int main()
    {
    	std::size_t constexpr N { 3 };
    	double a[N][N] {};
    	double b[N][N] {};
    
    	std::cout << "before:\na:\n";
    	std::copy(&a[0][0], &a[0][0] + N * N, std::ostream_iterator<double>{ std::cout, " " });
    	std::cout << "\nb:\n";
    	std::copy(&b[0][0], &b[0][0] + N * N, std::ostream_iterator<double>{ std::cout, " " });
    
    	std::random_device rd;
    	std::generate(&a[0][0], &a[0][0] + N * N, [&]() { return std::uniform_real_distribution<double>{ 0., 100. }(rd); });
    	std::generate(&b[0][0], &b[0][0] + N * N, [&]() { return std::uniform_real_distribution<double>{ 0., 100. }(rd); });
    
    	std::cout << "\n\nafter:\na:\n";
    	std::copy(&a[0][0], &a[0][0] + N * N, std::ostream_iterator<double>{ std::cout, " " });
    	std::cout << "\nb:\n";
    	std::copy(&b[0][0], &b[0][0] + N * N, std::ostream_iterator<double>{ std::cout, " " });
    
    	std::cout << "\n\n";
    }
    

    Sample Output:

    before:
    a:
    0 0 0 0 0 0 0 0 0
    b:
    0 0 0 0 0 0 0 0 0
    
    after:
    a:
    28.5402 75.9281 25.6085 91.049 91.9352 50.1916 96.3298 25.1886 49.7976
    b:
    5.14136 41.3971 18.052 79.7341 99.3335 81.8023 13.9887 82.5559 90.2164
    

    Aber was daraus wie das "Ergebnis" für c werden soll weiß ich leider nicht.

    Warum &b[0][0] und &b[0][0] + N * N? Überleg' Dir was die Eigenschaften eines Arrays bezüglich Datenlayout sind.

    ideone.



  • super vielen Dank. Ich versuch mich mal weiter.
    Daraus soll eine Multiplikation der beiden Matrizen werden, die dann c sein soll.😀
    Bin mir auch nicht sicher ob ich das ganze richtig angegangen bin.

    std::vector<std::vector<double> > matA;
    	std::vector<std::vector<double> > matB;
    	std::vector<std::vector<double> > matC;
    

    oder ob es so mehr Sinn macht 😑



  • @Swordfish
    ist es möglich einen Chat zu führen? Würde gerne mal alles mit dir durchsprechen, bzw. hätte gerne deine Hilfe für das gesamte Projekt. Stecke fest und komme nicht weiter.



  • @lauriMo sagte in Matrix mit Zahlen füllen:

    Bin mir auch nicht sicher ob ich das ganze richtig angegangen bin.

    Was nun? Steht N zur compile-time fest oder nicht!?

    @lauriMo sagte in Matrix mit Zahlen füllen:

    ist es möglich einen Chat zu führen?

    Es gibt ein Discord Dingsti. Dort sind viele engagierte User. Vor allem @Zhavok hilft Dir gerne.



  • This post is deleted!


  • Muss ja wenn ich damit rechnen möchte, oder nicht?



  • @lauriMo Wat mut?



  • N muss fest stehen wenn ich damit rechnen möchte.



  • Nein, muss nicht zur compile-time feststehen damit Du damit rechnen kannst. Aber wenn's zur compile-time (vs. run-time) feststeht, dann brauchst Du auch keinen std::vector<>1). Warum glaubst Du eigentlitsch ein 2d-irgendwas zu brauchen?

    Weiter: Warum brauchst Du überhaupt a und b wenn beides Zufallszahlen enthalten und c deren Produkt sein soll? Da kannst Du c gleich mit Zufallszahlen füllen. Was Du willst macht keinen Sinn. Null.

    1) Klugscheißerabwehr: wenn das Dingsti auf den Stack passt.

    Aber sei's drum:

    #include <cstddef>
    #include <array>
    #include <iostream>
    #include <random>
    #include <algorithm>
    
    int main()
    {
    	std::size_t constexpr N { 3 };
    	std::array<double, N * N> a {};
    	std::array<double, N * N> b {};
    
    	std::cout << "before filling with random numbers:\na:\n";
    	for (decltype(a)::size_type i{}; i != a.size(); ++i) {
    		std::cout << a[i] << ' ';
    		if ((i + 1) % N == 0)
    			std::cout.put('\n');
    	}
    
    	std::cout << "\nb:\n";
    	for (decltype(b)::size_type i{}; i != b.size(); ++i) {
    		std::cout << b[i] << ' ';
    		if ((i + 1) % N == 0)
    			std::cout.put('\n');
    	}
    
    	std::random_device rd;
    	std::generate(a.begin(), a.end(), [&]() { return std::uniform_real_distribution<double>{ 0., 100. }(rd); });
    	std::generate(b.begin(), b.end(), [&]() { return std::uniform_real_distribution<double>{ 0., 100. }(rd); });
    
    	std::cout << "\n\nafter filling with random numbers:\na:\n";
    	for (decltype(a)::size_type i{}; i != a.size(); ++i) {
    		std::cout << a[i] << ' ';
    		if ((i + 1) % N == 0)
    			std::cout.put('\n');
    	}
    
    	std::cout << "\nb:\n";
    	for (decltype(b)::size_type i{}; i != b.size(); ++i) {
    		std::cout << b[i] << ' ';
    		if ((i + 1) % N == 0)
    			std::cout.put('\n');
    	}
    
    	std::array<double, N * N> c { a };
    	std::transform(a.begin(), a.end(), b.begin(), c.begin(), [](auto lhs, auto rhs) { return lhs * rhs; });
    
    	std::cout << "\n\nresult:\nc:\n";
    	for (decltype(c)::size_type i{}; i != c.size(); ++i) {
    		std::cout << c[i] << ' ';
    		if ((i + 1) % N == 0)
    			std::cout.put('\n');
    	}
    }
    

    Sample Output:

    before filling with random numbers:
    a:
    0 0 0
    0 0 0
    0 0 0
    
    b:
    0 0 0
    0 0 0
    0 0 0
    
    
    after filling with random numbers:
    a:
    86.8078 42.2466 30.9909
    5.59847 47.2806 37.5735
    90.3041 95.5185 0.0146773
    
    b:
    45.3534 30.7286 37.849
    87.1815 7.62351 76.5596
    55.8694 54.9992 85.2025
    
    
    result:
    c:
    3937.02 1298.18 1172.98
    488.083 360.444 2876.61
    5045.24 5253.44 1.25055
    

    // edit: Ach so, Matrizen multipliziert man ja anderster. Naja, what shalls.



  • Vorsicht mit std::random_device... Mancher Kompiler bekommt es nicht hin, diese Klasse korrekt zu implementieren hust MinGW hust



  • Wat hat der Compiler mit der Implementifizierung von std::random_device zu tun?



  • @hustbaer Naja, das war wohl flapsig ausgedrückt. Die Standartbibliothek die mit dem MinGW-gcc (und auch mingw64) kommt ist halt in dieser Hinsicht buggy, wenn man so will. Andreaseits kann man den Standart auch so auslegen daß es absolut kosher ist, was sie tut. *shrugs_shoulders* *runs*



  • Soso. Wo fehlt's denn? Macht mal Bug-Ticket oder Pull-Request.



  • @hustbaer https://sourceforge.net/p/mingw-w64/bugs/338/

    Guten Morgen btw.

    Aber ich habe sowieso noch nicht kapiert warum jemand auf Windows auf biegen und brechen MinGW-Zeugs haben will. Spätestens mit WSL könnte (sollte?) das Zeugs Geschichte sein dürfen. Was will ich MinGW wenn ich gcc, clang, whatever nativ auf linux haben kann?



  • @Swordfish Wow, die Leute die da kommentieren (bei dem MinGW Bug Ticket)... da sind schon ein paar ganz besonders helle Leuchten dabei 🙂

    Und ps: GCC bzw. Clang auf Windows haben wollen verstehe ich voll und ganz. Wieso sollte man nicht gute, freie, alternative Compiler auf Windows für native Windows Anwendungen haben wollen? Und ebenso: Wieso sollte man nicht eine alternative STL auf Windows haben wollen?


Log in to reply