matematykaszkolna.pl
pytanie do fil Mariusz: Fil , widziałeś poniższy kod https://rosettacode.org/wiki/Reduced_row_echelon_form Jak wyeliminowałbyś instrukcję break tak aby sterowanie pętlami odbywało się za pomocą warunków logicznych
1 cze 12:19
fil: w tym przypadku − wedlug mnie mozna abrdzo prosto. Wywalic te ify, i dodac zewnetrznego while'a z dobrym warunkiem
1 cze 12:48
Mariusz: a masz na to jakiś pomysł ?
1 cze 12:57
fil: while (lead < columnCount)
1 cze 13:23
Mariusz: A gdzie konkretnie byś umieścił tą pętle I czy twój pomysł aby na pewno dawałby poprawne wyniki
1 cze 14:09
fil: Cos takiego. Nie wyem czy by dawal poprawne wyniki, trzeba by wytestowac while lead < columnCount do for 0 ≤ r < rowCount do i = r while M[i, lead] = 0 do i = i + 1 if rowCount = i then i = r lead = lead + 1 end if end while Swap rows i and r If M[r, lead] is not 0 divide row r by M[r, lead] for 0 ≤ i < rowCount do if i ≠ r do Subtract M[i, lead] multiplied by row r from row i end if end for lead = lead + 1 end for end while
1 cze 14:23
fil: Zrobiles implementacje tego algorytmu? Jesli nie to moge zrobic i zobaczyc czy dziala poprawnie
1 cze 14:25
fil: for 0 ≤ r < rowCount do −− jak zrozumiec ten zapis?
1 cze 14:28
Mariusz: https://pastebin.com/HKbckvux Do ich kodu dopisałem funkcję main Musiałbyś skopiować kod , w kopii podmienić ciało funkcji rref na swoją propozycję a następnie porównać wyniki jakie otrzymujesz
1 cze 14:31
fil: Wlasnie implementuje moja wersje, jak skoncze to porownam i wyniki i kod
1 cze 14:35
Mariusz: for 0 ≤ r < rowCount do −− jak zrozumiec ten zapis? Masz zmienną r która przebiega od zera do rowCount − 1 rowCount jest liczbą wierszy a r chyba jest rzędem macierzy choć nie jestem tego pewien
1 cze 14:38
fil: Musialem gdzies zepsuc implementacje, bo nawet z tymi ifami w srodku dostaje bledny ouput
1 cze 14:48
fil: To jest moje implementacja − robie wszyskto na vectorze, jednak program daje polowicznie dobry output void toReduce(std::vector<std::vector<double>>& matrix, int rows, int cols) { int lead = 0; int rowCount = rows; int columnCount = cols; for (int r = 0; r < rowCount; r++) { if (columnCount <= lead) break; int i = r; while (matrix[i][lead] == 0) { i++; if (rowCount == i) { i = r; lead++; if (columnCount==lead) { lead−−; break; } } } std::swap(matrix[i], matrix[r]); if (matrix[r][lead] != 0) { for (int j = 0; j < columnCount; j++) { matrix[r][j] /= matrix[r][lead]; } } for (int k = 0; k < rowCount; k++) { if (k != r) { double s = matrix[k][lead]; for (int x = 0; x < columnCount; x++) { matrix[k][x] −= s * matrix[r][x]; } } } lead++; } Input: 1, 2, −1, −4 2, 3, −1, −11 −2, 0, −3, 22 Output poprawny: 1, 0, 0, −8 −0, 1,0, 1 −0, −0, 1, −2 Output mojego programu: 1, 0, 0, 80 0, 1, 0, −29 −0, −0, 1, 26
1 cze 14:59
fil: I jak Mariusz, znajdziesz blad w powyzszym kodzie?
1 cze 16:43
fil: Znalazlem blad, dlaczego tak jest? Ten fragment kodu jest poprawny: double div = matrix[r][lead]; if (div != 0) { for (int j = 0; j < columnCount; j++) { matrix[r][j] /= div; } } Tylko dlaczego to nie jest: if (matrix[r][lead] != 0) { for (int j = 0; j < columnCount; j++) { matrix[r][j] /= matrix[r][lead]; } }
1 cze 17:13
fil: Zalaczam dzialajacy kod. Jednak nie wiem jak sie pozbyc tych ifow narazie, bo z petla while() nie dziala void toReduce(std::vector<std::vector<double>>& matrix, int rows, int cols) { int lead = 0; int rowCount = rows; int columnCount = cols; for (int r = 0; r < rowCount; r++) { if (columnCount <= lead) break; int i = r; while (matrix[i][lead] == 0) { i++; if (i == rowCount) { i = r; lead++; if (columnCount == lead) { lead−−; break; } } } std::swap(matrix[r], matrix[i]); double div = matrix[r][lead]; if (div != 0) { for (int j = 0; j < columnCount; j++) { matrix[r][j] /= div; } } for (int k = 0; k < rowCount; k++) { if (k != r) { double s = matrix[k][lead]; for (int x = 0; x < columnCount; x++) { matrix[k][x] −= (s * matrix[r][x]); } } } lead++; } }
1 cze 17:20
fil: Wskazesz na ktorej stronie jest tutaj ten algorytm odwracania macierzy? http://broiler.astrometry.net/~kilian/The_Art_of_Computer_Programming%20-%20Vol%201.pdf
1 cze 17:24
Mariusz: Odwracanie macierzy jest na stronie 307 zadanie nr 18 Osiowanie jest na stronach 303−304
1 cze 19:00
fil: Pokazesz przyklad jak ma wygladac odwrocona macierz?
1 cze 19:10
Mariusz: Ja tam się w ten pseudokod dobrze nie wczytywałem Gdyby był jakoś lepiej opisany to może coś bym napisał Spróbuj coś na podstawie opisu algorytmu coś napisać
1 cze 19:43
fil: zatrzymalem sie na "Search row k in all columns not yet used as a pivot column"
1 cze 19:53
fil: Mariusz, odpowiesz na pytanie ktore zadalem o godzinie 17:13? Sam jestem ciekaw
1 cze 21:42
Mariusz: Nie wiem co jest nie tak , może brak rzutowania Jesteś pewny że wykonuje dzielenie na liczbach typu double ? "Search row k in all columns not yet used as a pivot column" Wyszukaj wiersz k we wszystkich kolumnach nie użytych jeszcze jako kolumna osiowa
1 cze 23:05
Mariusz: a dałbyś jeszcze jakąś funkcję main abym mógł się pobawić twoją funkcją
1 cze 23:12
fil: Troche balagan w mainie int main() { std::vector<std::vector<double>> A = { { 1, 2, −1, −4 }, { 2, 3, −1, −11 }, { −2, 0, −3, 22 } }; std::cout << "Przed:\n"; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { std::cout << A[i][j] << ' '; } std::cout << '\n'; } std::cout << '\n'; std::cout << "Po:\n"; toReduce(A, 3, 4); for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { std::cout << A[i][j] << ' '; } std::cout << '\n'; } }
1 cze 23:15