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