[C++] Macierz diagonalna

sorcerer123
Użytkownik
Użytkownik
Posty: 295
Rejestracja: 21 gru 2008, o 08:57
Płeć: Mężczyzna
Lokalizacja: z miasta
Podziękował: 6 razy
Pomógł: 6 razy

[C++] Macierz diagonalna

Post autor: sorcerer123 »

Mam takie zadanie:
Dla danej macierzy kwadratowej A napisz funkcję, która zwróci jej macierz diagonalną.

Tutaj jest moje rozwiązanie

Kod: Zaznacz cały

double** diag (double** A, int n)
{
	for(int k = 0; k < n; ++k)
	{
		for(int i = 0; i < k; ++i)
			for(int j = k; j < n; ++j)
				A[i][j] -= A[i][k] / A[k][k] * A[k][j];

		for(int i = k + 1; i < n; ++i)
			for(int j = k; j < n; ++j)
				A[i][j] -=  A[i][k] / A[k][k] * A[k][j];
	}
	return A;
}
Wydaje mi się, że coś jest tutaj źle, ale już nie wiem, co mam poprawić.
Proszę o jakieś wskazówki.
Ostatnio zmieniony 15 gru 2012, o 13:05 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
mk321
Użytkownik
Użytkownik
Posty: 47
Rejestracja: 13 sty 2011, o 20:13
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 14 razy

[C++] Macierz diagonalna

Post autor: mk321 »

Jeśli to po prostu macierz "której wszystkie współczynniki leżące poza główną przekątną są zerowe" to zadanie jest proste.
Wystarczy usunąć (przypisać zera) wartościom, które nie leżą na przekątnej.
Aby sprawdzić, które wartości leżą na przekątnej porównujemy ze sobą dwie współrzędne (np. i oraz j) - jeśli są równe, to znaczy, że jest to element przekątnej. Ale my chcemy odwrotnie, czyli jeśli się nie równają to przypisujemy 0.

Gotowy kod:

Kod: Zaznacz cały

double** diag (double** A, int n)
{
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) {
            if(i!=j) {
                A[i][j] = 0;      
            }
        }
    }
    return A;
}
Chyba, że ja czegoś nie zrozumiałem.
Awatar użytkownika
steal
Użytkownik
Użytkownik
Posty: 1043
Rejestracja: 7 lut 2007, o 18:35
Płeć: Mężczyzna
Lokalizacja: Białystok|Warszawa
Podziękował: 6 razy
Pomógł: 160 razy

[C++] Macierz diagonalna

Post autor: steal »

W waszych implementacjach jest błąd, polegający na ingerowaniu w wartości przechowywane przez wskaźnik na macierz A. Po wykonaniu takiej funkcji otrzyma się macierz diagonalną, ale przy okazji straci informację o postaci pierwotnej macierzy A (po prostu zostanie nadpisana).

Kod: Zaznacz cały

double** diag (double** A, int n){
    //Alokacja pamięci na macierz diagonalną
    double ** B = new double* [n];   
    for(int i = 0; i < n; ++i)
        B[i] = new double[n];

    //Tworzenie macierzy diagonalnej
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) {
            if(i!=j)
                B[i][j] = 0;      //Elementy poza przekątną są zerami
            else
                B[i][j] = A[i][j];  //Kopiowanie elementów leżących na przekątnej
        }
    }
    return B;
}
Po wykorzystaniu macierzy należy zwolnić pamięć przez nią zajmowaną!
abc666

[C++] Macierz diagonalna

Post autor: abc666 »

Myślę, że jednak sorcerer123 ma za zadanie zdiagonalizować macierz, a nie wpisać kilka zer
ODPOWIEDZ