[ Cypher @ 08.03.2005. 19:26 ] @
Želio bih zamoliti za pomoć u vezi ovog zadatka.Naime zadata je kvadratna matrica(nXn),gdje se n i elementi njeni unose.Treba napisati algoritam koji će izbaciti inverz te matrice.Imama dojam da bih znao riješit zadatke za pojedinačne slučajeve n=2 ili3....ali za n........teško....

Hvala!

p.s.nekima će se ovo učinit lagano.....ali pomozite!
[ NeznamTkoSam @ 08.03.2005. 19:55 ] @
Koji programski jezik?
[ Cypher @ 08.03.2005. 20:46 ] @
ma pascal ili c++...svejedno je.....
[ _owl_ @ 08.03.2005. 21:43 ] @
Mozes da uradis preko Gausovog algoritma za odredjivanje inverzne matrice.
Ideja algoritma je vrlo jednostavna. Radi se sa dve matrice pocetnom i jedinicnom (cije su dimenzije jednake onim od pocetne matrice).
Od pocetne matrice treba da dobijes jedinicnu (dovoljan uslov da je determinanta razlicita od 0) primenom dozvoljenih operacija (pomocu kojih se dobija ekvivalentna matrica). Istovremenom primenom ovih operacija na polaznu jedinicnu matricu dobices inverznu kada pocetnu svedes na jedinicnu.
[ Goran Rakić @ 08.03.2005. 23:03 ] @
Da, to jeste dobro resenje ali treba pronaci dobitnu kombinaciju elementarnih transformacija nad kolonama. (na papiru jeste lako ali nisam siguran bas kako bi se to moglo iskodirati, a da slozenost algoritma ne bude eksponencijalna - mada verovatno i postoji neko resenje za to)

Ipak, ukoliko su matrice manje mozes probati pomocu:

[ Časlav Ilić @ 09.03.2005. 14:39 ] @
Citat:
Goran Rakić:
Da, to jeste dobro resenje ali treba pronaci dobitnu kombinaciju elementarnih transformacija nad kolonama. (na papiru jeste lako ali nisam siguran bas kako bi se to moglo iskodirati, a da slozenost algoritma ne bude eksponencijalna - mada verovatno i postoji neko resenje za to)

U stvari, te kombinacije ne moraju da se traže, dovoljno je u svakom koraku pomnožiti i oduzeti tekuću vrstu od svih narednih tako da se anuliraju svi elementi ispod trenutnog položaja na dijagonali (doduše, uz jednu malu kvačicu). Zatim isto to krećući se odozdo, da se anulira sve iznad dijagonale. Tako da složenost ispadne kubna.

Citat:

Ipak, ukoliko su matrice manje mozes probati pomocu:

Uh, ovo je ne samo eksponencijalne složenosti (što možda nije ni bitno, jer mi se čini da je ovde neka obrazovna potreba), nego je, rekao bih, i dobrano zeznuto za implementaciju u odnosu na Gausov algoritam (koga čine, u suštini, tri ugnježdene petlje).
[ Goran Rakić @ 09.03.2005. 16:01 ] @
Da sada sam skapirao kako se implementira gausov metod. Hvala na razjasnjenju. :) Jeste mnogo brze i lakse za implementaciju.

Sto se implementacije tice, resenje za determinantu postoji na ovom forumu, a za adjungovanu matricu pa to je samo determinanti. (naravno poslednja recenica je ironija, i svakako da je gausov metod jednostavniji)
[ yooyo @ 11.03.2005. 14:47 ] @
Probaj LU dekompoziciju...

http://www.zpm.fer.hr/courses/...html/..%5Chtml%5C2.2%20LUP.htm

yooyo
[ Cypher @ 16.03.2005. 16:57 ] @
Moze li mi neko ovaj kod prebacit u pascal...bio bih jako zahvalan...

#include <iostream>
#include <cstdio>
#include <cmath>
#include <climits>

using namespace std;

#define MAX 100

struct matrica
{
float data[MAX][MAX];
int m, n;
};

float det(matrica &a)
{
float res = INT_MAX;
if (a.m != a.n)
{
printf("Ovo nije kvadratna matrica!");
}
else if (a.m == 1)
{
res = a.data[0][0];
}
else
{
res = 0;
for (int i = 0; i < a.m; i++)
{
matrica b;
b.m = a.m - 1;
b.n = a.n - 1;
int mcur = 0, ncur = 0;
for (int m = 0; m < a.m; m++)
for (int n = 0; n < a.n; n++)
{
if (m != i && n != 0)
{
b.data[mcur][ncur] = a.data[m][n];
ncur++;
mcur += ncur / b.n;
ncur %= b.n;
}
}
res += (i % 2 == 0?1:-1) * a.data[0] * det(b);
}
}
return res;
}

int main()
{
matrica a;
matrica trans;
matrica adj;
matrica inv;
scanf("%i", &a.m);
a.n = a.m;
trans.n = adj.n = inv.n = a.n;
trans.m = adj.m = inv.m = a.m;
for (int i = 0; i < a.m; i++)
for (int j = 0; j < a.n; j++)
{
scanf("%f", &a.data[j]);
trans.data[j] = a.data[j];
}
float c = 1.0 / det(a);
int maxw = 0;
for (int i = 0; i < adj.m; i++)
for (int j = 0; j < adj.n; j++)
{
matrica b;
b.m = trans.m - 1;
b.n = trans.n - 1;
int mcur = 0, ncur = 0;
for (int m = 0; m < trans.m; m++)
for (int n = 0; n < trans.n; n++)
{
if (m != i && n != j)
{
b.data[mcur][ncur] = trans.data[m][n];
ncur++;
mcur += ncur / b.n;
ncur %= b.n;
}
}
adj.data[j] = ((i + j) % 2 == 0?1:-1) * det(b);
inv.data[j] = c * adj.data[j];
}
for (int i = 0; i < inv.m; i++)
{
for (int j = 0; j < inv.n; j++)
{
printf("%+.2f\t", inv.data[j]);
}
printf("\n");
}
system("pause");
}

Hvala!