Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 16. 04. 2010 13:27

zlamal89
Příspěvky: 26
Reputace:   
 

Operace s Maticemi

Zdar všichni! Kdyby se někdo nudil a prostě musí programovat, jelikoý bez toho nemůže žít tak tady mám pro něj jeden příklad na matice:

Vytvořte třídu Matrix, která bude představovat matici typu n/m, čili o n řádcích a m sloupcích a bude obsahovat metody umožňující operace s touto maticí. Při vypracování se držte následujících pokynù:
1. Vhodně zvolte konstruktory. Matici lze vytvořit na základě znalostí jejího typu, na základě existujícího dvojrozměrného pole nebo jako kopii již
existující instance matice.
2. Prvky matice budou typu double.
3. Vaše třída bude obsahovat tři statické metody, které budou sloužit k vytvoření speciálních typù matic:
ones() { vytvoří matici obsahující samé jedničky,
unity () { jednotková matice (jediné nenulové prvky jsou jedničky na hlavní diagonále),
random() { matice náhodných èísel z intervalu h0; 1i.
Ve všech třech případech budou mít metody vhodné parametry, určující dimenzi matice.
4. Další metody budou představovat běžné úkony, které jsme schopni s maticemi provádět. První operand představuje instance sama, druhý operand, pokud je potřeba, předávejte metodě jako parametr, výsledky budou metody vracet jako novou instanci třídy Matrix:
transpozice matice,
sčítání a odčítání matic,
násobení matic,
porovnání matic (zda se rovnají odpovídající prvky matic),
výpis prvkù matice v přehledné podobě,
determinant matice.
5. Vytvořte metodu, která na základě Gaussovy eliminace (GE) převede matici na horní trojúhelníkový tvar. Této úpravy využijte v metodě pro vý-
počet determinantu matice. Připomeňme, že postup GE souvisí s elementárními řádkovými úpravami, pomocí nichž nulujeme prvky pod hlavní
diagonálou.
6. Implementujte metodu pro výpočet LU rozkladu dané matice.
Poznámky
Při výpočtu determinantu pamatujte na to, že determinant určujeme u čtvercové matice. Při výpočtu GE budete používat elementární řádkové úpravy { záměna dvou řádkù matice, vynásobení řádku nenulovou konstantou a přičtení násobku jednoho řádku k jinému. Je tedy zřejmì výhodné tyto implementovat do vlastních metod.
Při GE by mohlo docházet k velkým zaokrouhlovacím chybám, proto implementujte GE s částečným výběrem hlavního prvku. Hlavním prvkem
se zvolí vždy prvek s největší absolutní hodnotou v příslušném sloupci. GE je obecný převod matice na horní trojúhelníkovou či diagonální matici.
Což ještì neznamená, že musíte řešit soustavu rovnic. A z toho plyne, že by tato metoda měla fungovat na všechny matice. V případì čtvercové ji
můžete použít pro výpočet determinantu.
Neuvažujte špatnou podmíněnost matice, tzn. hlavní prvky matice nebudou blízké nule.

Offline

  • (téma jako vyřešené označil(a) zlamal89)

#2 16. 04. 2010 22:31

zlamal89
Příspěvky: 26
Reputace:   
 

Re: Operace s Maticemi

kdyby jste mi mohli poradit jak udelat tu Gausovu eliminaci tam vubec nevim jak

Offline

 

#3 16. 04. 2010 22:47

septolet
Příspěvky: 334
Reputace:   
 

Re: Operace s Maticemi

Až do tvého druhého příspěvku jsem doufal, že si to sem vložil jen tak. Jako abychom snad nezakrněli, prostě jako takovou zajímavou úlohu (i když nevím, co zajímavého bychom na tom našli). Ale ty to chceš celé v podstatě vypracovat...bod 4 v pravidlech fóra si jistě četl...Takže jak bys to řešil?

Offline

 

#4 17. 04. 2010 16:20

zlamal89
Příspěvky: 26
Reputace:   
 

Re: Operace s Maticemi

Nechci aby mi to tu cele nekdo napsal to ani nesmim protoze to musim pochopit takze ne akorat kdyby nekdo vedel jak udelat tu Gausovu eliminaci byl bych mu vdecen. Vypracovat to cele vazne nechci. S temi zakladnimi operacemi jako je +-* si poradim bezproblemu akorat tu Gausovku vazne nevim jak

Offline

 

#5 17. 04. 2010 22:20

zlamal89
Příspěvky: 26
Reputace:   
 

Re: Operace s Maticemi

A i kdyby to sem nekdo napsal tak je mi to k nicemu kdyz to nepochopim jelikoz se to bude jeste obhajovat

Offline

 

#6 18. 04. 2010 12:53

septolet
Příspěvky: 334
Reputace:   
 

Re: Operace s Maticemi

Jak už bylo řečeno, snažíme se pomocí elementárních úprav na matici dostat horní trojúhelníkový tvar. To je takový tvar, který má pod hlavní diagonálou (prvky hlavní diagonály mají x-ovou i y-ovou souřadnici stejnou) samé 0. Toho se dosáhne násobením a sčítáním řádků a třeba prohazováním jednotlivých řádků. Na internetu můžeš najít spoustu materiálů na toto téma, viz. třeba http://cs.wikipedia.org/wiki/Gaussova_e … %AD_metoda Tady jsem našel nějakou implementaci v Javě http://moon.felk.cvut.cz/~pjv/Jak/_math/m058/src/ moc jsem to nezkoumal, takže doufám, že to funguje.

Offline

 

#7 18. 04. 2010 14:01 — Editoval gladiator01 (18. 04. 2010 14:46)

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Operace s Maticemi

↑ zlamal89:
Já mam (toho GEA) implementaci v c++ (resp. C, výpis se dá snadno přepsat), kdyby jsi chtěl.


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#8 19. 04. 2010 17:29

zlamal89
Příspěvky: 26
Reputace:   
 

Re: Operace s Maticemi

↑ gladiator01:
Kdyby si byl tak hodny a hodil ho sem nebo na mail Harryhav@seznam.cz
diky moc

Offline

 

#9 19. 04. 2010 19:29

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Operace s Maticemi

Code:

#include<iostream> 
#include<math.h>
#include<iomanip>
#define N 4 
#define M 5 

using namespace std;

void GEA(float a[N][M])
{
  int max=0;
  float pom; 
  for(int i=0; i<N; i++)              //nalezení pivota
  {
    for(int j=i+1; j<N; j++)
      if(fabs(a[j][i])>fabs(a[i][i]))
        max=j;
        
    for(int k=i; k<M; k++)         
    {
      pom=a[i][k];
      a[i][k]=a[max][k];
      a[max][k]=pom;
    }
    
    for(int j=i+1; j<N; j++)
      for(int k=N; k>=i; k--) 
        a[j][k]= a[j][k] - a[i][k] * a[j][i] / a[i][i];
  }
  
  //výpis
  for(int i=0; i<N; i++)
   {//vypisuje prvky, když dojde na konec řadky, odřádkuje
     for(int j=0; j<M-1; j++)
     {
        cout << setprecision(2) << setw(6) << a[i][j] << " ";
       
        if(j==N-1)
        {
          cout << endl; 
        }
     }
   }                   
}

int main()
{
   int i,j,k,l=1;
  
   // Inicializace matice A
                     //11,12,13,14,  21,22,23,24, 31,32,33,34,  41,42,43,44
   float A[N][M]={{5, 2, 3, 4},{3, 6, 7, 8},{1, 10, 5, 12},{0, 14, 15, 16}};
   //VÝPIS MATICE --------------------------------------------------------------
   
   cout << "Matice A:" << endl;
   for(i=0; i<N; i++)
   {//vypisuje prvky, když dojde na konec řadky, odřádkuje
     for(j=0; j<M-1; j++)
     {
        cout << setw(3) << A[i][j] << " ";
       
        if(j==N-1)
        {
          cout << endl; 
        }
     }
   }
   
   cout << endl; 
   GEA(A);
   cout << endl; 

   system("pause");
   return 0;
}

Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#10 19. 04. 2010 19:56

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Operace s Maticemi

↑ gladiator01: No možná to funguje, ale je to napsaný tak, jak se to psát nemá. Je to humus bez ukazatelů. Tady mám příklad, co jsme nedávno dělali ve škole pro operace s dvěmi maticemi. Už prostě od jisté doby nemohu snést GLOBÁLNÍ proměnné. Velice názorné:

Code:

#include <stdlib.h>
#include <stdio.h>
 
#define MATRIX_SIZE 3
 
typedef double TMatrix[MATRIX_SIZE][MATRIX_SIZE];
 
void readMatrix(TMatrix* matrix);
 
void add(TMatrix* matrix, const TMatrix* matrix1, const TMatrix* matrix2);
 
void sub(TMatrix* matrix, const TMatrix* matrix1, const TMatrix* matrix2);
 
void printMatrix(const TMatrix* matrix);
 
int main(int argc, char** argv) {
        TMatrix A, B, C;
 
        printf("Matice A:\n");
        readMatrix(&A);
 
        printf("Matice B:\n");
        readMatrix(&B);
 
        add(&C, &A, &B);
 
        printMatrix(&C);
        
        system("PAUSE");
 
        return (EXIT_SUCCESS);
}
 
void readMatrix(TMatrix* matrix) {
        for(int i = 0; i < MATRIX_SIZE; i++) {
                for(int j = 0; j < MATRIX_SIZE; j++) {
                        printf("Pozice %d %d: ", i, j);
                        scanf("%lf", matrix[i][j]);
                }
        }
}
 
void add(TMatrix* matrix, const TMatrix* matrix1, const TMatrix* matrix2) {
        for(int i = 0; i < MATRIX_SIZE; i++) {
                for(int j = 0; j < MATRIX_SIZE; j++) {
                        *matrix[i][j] = *matrix1[i][j] + *matrix2[i][j];
                }
        }
}
 
void sub(TMatrix* matrix, const TMatrix* matrix1, const TMatrix* matrix2) {
        for(int i = 0; i < MATRIX_SIZE; i++) {
                for(int j = 0; j < MATRIX_SIZE; j++) {
                        *matrix[i][j] = *matrix1[i][j] - *matrix2[i][j];
                }
        }
}
 
void printMatrix(const TMatrix* matrix) {
        for(int i = 0; i < MATRIX_SIZE; i++) {
                for(int j = 0; j < MATRIX_SIZE; j++) {
                        printf("Pozice %d %d = %f\n", i, j, *matrix[i][j]);
                }
        }
}

Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#11 19. 04. 2010 20:15

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Operace s Maticemi

↑ RePRO:
Proč to psát jednoduše, když to jde složitě, co? Mě se zase nelíbí ta tvoje šílenost. A nedělej chytrýho, to co jsem napsala je podle knížky a autor je určitě lepší programátor než ty.

Můžu se zeptat jak dlouho se učíš programovat?


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#12 19. 04. 2010 20:24

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Operace s Maticemi

↑ gladiator01: Pro malej projekt se to dá použít, ale jenom se snažím poradit, že to není optimální. Ne, že to nefunguje, to jsem nenapsal. Já mám programování a logické uvažování rád, proto si vždy musím trošku rejpnout. Neznamená to nic špatného proti Tvé osobě. Učím programovat? Dlouho. Nejraději mám PHP, C++ už není má silná stránka.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#13 19. 04. 2010 20:34

halogan
Ondřej
Místo: UK
Příspěvky: 4528
Škola: IES FSV UK (09-12, Bc.)
Pozice: student
Reputace:   106 
 

Re: Operace s Maticemi

↑ RePRO:

Příště prosím trochu konstruktivnější kritiku hned na začátku, ať tu nevytváříme takovou atmosféru. Děkuji.

Offline

 

#14 20. 04. 2010 20:20

zlamal89
Příspěvky: 26
Reputace:   
 

Re: Operace s Maticemi

Souhlasím ta první verze se mi líbí více a je snáze pochopitelná, ale jinak je to celkem humus no....

Offline

 

#15 20. 04. 2010 20:33

halogan
Ondřej
Místo: UK
Příspěvky: 4528
Škola: IES FSV UK (09-12, Bc.)
Pozice: student
Reputace:   106 
 

Re: Operace s Maticemi

↑ zlamal89:

To vy jste sem přišel s prosbou, tak, prosím, vynechte nějaké ostřejší hodnocení.

Offline

 

#16 20. 04. 2010 20:47

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Operace s Maticemi

↑ zlamal89:
To je teda vděk, buď rád, že ti je někdo ochoten pomoci.
To miluji, takovéhle experty, kteří žádají o pomoc a pak kritizují. Proč ses ptal když jseš tak chytrý?

↑ halogan:
Děkuji.


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#17 20. 04. 2010 20:55

septolet
Příspěvky: 334
Reputace:   
 

Re: Operace s Maticemi

↑ gladiator01: ↑ halogan: Dle mého tím "humusem" mohl zlamal89 myslet i chování některých v tomto vlákně, ne uvedený kód. Doufám, že se nepletu.

Offline

 

#18 20. 04. 2010 21:00

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Operace s Maticemi

↑ septolet:
ty jseš teda optimista, :) spíš se opičil po RePRO


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#19 20. 04. 2010 21:03

septolet
Příspěvky: 334
Reputace:   
 

Re: Operace s Maticemi

↑ gladiator01: V tomhle asi optimista jsem. Moc mi totiž nejde do hlavy, proč by někdo žádal o radu a po odpovědi nám vynadal. To mi přijde strašně divné, proto se v tom snažím najít i jiné vysvětlení. No uvidíme, třeba to zlamal89 nějak vysvětlí.

Offline

 

#20 21. 04. 2010 10:09

zlamal89
Příspěvky: 26
Reputace:   
 

Re: Operace s Maticemi

Asi jste me nepochopili, ja myslel ze ten projekt je humus a ne to co jste tu napsali za to vam dekuju

Offline

 

#21 21. 04. 2010 12:58

gladiator01
Místo: Jindřichův Hradec
Příspěvky: 1587
Škola: ZČU FAV - SWI
Pozice: absolvent
Reputace:   53 
Web
 

Re: Operace s Maticemi

↑ zlamal89:
Tak to sory, máš se pořádně vyjdřovat.


Naděje jako svíce jas, potěší srdce štvané, čím temnější je noční čas, tím zářivěji plane.
VIVERE - MILITARE EST (Seneca)
Vím, že nic nevím. - Sokrates

Offline

 

#22 21. 04. 2010 14:08

zlamal89
Příspěvky: 26
Reputace:   
 

Re: Operace s Maticemi

↑ gladiator01:
Nikdy neurazim nekoho kdo se mi snazi pomoct to bych byl potom pitomec

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson