muMECH  1.0
matrix_vector.h
Go to the documentation of this file.
1 #ifndef MUMECH_MATRIX_VECTOR_H
2 #define MUMECH_MATRIX_VECTOR_H
3 
4 #include <stdio.h>
5 #include <string.h>
6 
13 namespace mumech {
14 
15 
16 // ***********************************************************************************************************
17 // **************** 2D ONLY - START **********************************************************************
18 // ***********************************************************************************************************
19 
21 class vektor
22 {
23  public:
24  long p;
25  double *v;
26  vektor(){ p=0; v=NULL; };
27  vektor(long n){ p=n; v=new double[p]; long i; for(i=0;i<p;i++)v[i]=0.0; };
28  ~vektor(){ if(v!=NULL){ delete []v;v=NULL; p=0; } };
29  void odalokovat(){ if(v!=NULL){ delete []v;v=NULL; p=0; } };
30 
32  double norma () const;
33 
34  void vynulovat(){ long i; for(i=0;i<p;i++)v[i]=0.0; };
35  void rovna_se(vektor &co){ long i; for(i=0;i<p;i++)v[i]=co.v[i]; };
36  void krat(double cislo){ long i; for(i=0;i<p;i++)v[i]=v[i]*cislo; };
37  void define(long n){ p=n; v=new double[p]; long i; for(i=0;i<p;i++)v[i]=0.0; };
38  double& g(long i){return v[i];};
39  void print(FILE *soubor){
40  long i;
41  for(i=0;i<p;i++){
42  //fprintf(soubor,"%ld) %4.10f\n",i,v[i]);
43  fprintf(soubor, "%.10f\n", v[i]);
44  }
45  fprintf(soubor,"\n");
46  }
47 
48  /*int MxV(vektor &vek){
49  if(s!=vek.p)return 0;
50  matrix zaloha(r,s);
51  int u,v,r;
52  for(u=0;u<r;u++)for(v=0;v<s;v++)m[u][v]+=g(u,v);
53  vynulovat();
54  for(u=0;u<r;u++)for(v=0;v<s;v++)for(r=0;r<s;r++)m[u][v]+=zaloha.g(u,r)*vek.v[r];
55  return 1;
56  }; */
57  int pricist(vektor &co){if(p!=co.p)return 0;long i;for(i=0;i<p;i++)g(i)+=co.g(i);return 1;};
58  int odecist(vektor &co){if(p!=co.p)return 0;long i;for(i=0;i<p;i++)g(i)-=co.g(i);return 1;};
59  void deleno(long double cislo) { long i; for (i = 0; i<p; i++)v[i] = v[i] / cislo; };
60 };
61 
63 class matice
64 {
65  public:
66  int R;
67  int S;
68  int r;
69  int s;
70  bool t;
71  double *m;
72 
73  matice(){ R=0; S=0; r=0; s=0; t=false; m=NULL; };
74  matice(int radku,int sloupcu){
75  int i;
76  t=false;
77  R=r=radku;S=s=sloupcu;
78  m=new double[r*s];
79  for(i=0;i<r*s;i++)m[i]=0.0;
80  };
81 
82  void define(int radku,int sloupcu){
83  int i;
84  t=false;
85  R=r=radku;S=s=sloupcu;
86  m=new double[r*s];
87  for(i=0;i<r*s;i++)m[i]=0.0;
88  };
89 
90  ~matice(){ if(m!=NULL){ delete []m; R=r=0; S=s=0; m=NULL; t=false; } };
91 
92  void destruct(){ if(m!=NULL){ delete []m; R=r=0; S=s=0; m=NULL; t=false; } };
93  double& g(int radek,int sloupec){
94  if(t){
95  if( radek>=0 && radek<=r && sloupec>=0 && sloupec<=s)return m[sloupec*S+radek];
96  }else{
97  if( radek>=0 && radek<=r && sloupec>=0 && sloupec<=s)return m[radek*S+sloupec];
98  }
99  printf("\nCHYBA - pokus o pristup mimo oblast matice\n");
100  return m[0];
101  };
102 
103  void vynulovat(){int i;for(i=0;i<r*s;i++)m[i]=0.0;};
104  void krat(double cislo){int i;for(i=0;i<r*s;i++)m[i]*=cislo;};
105  //NAHORU OK
106 
107  int nasobeni(matice &a, matice &b){
108  if(r!=a.r || s!=b.s || a.s!=b.r)return 0;
109  int u,v,rr;
110  vynulovat();
111  for(u=0;u<r;u++)for(v=0;v<s;v++)for(rr=0;rr<a.s;rr++)g(u,v)+=1.0*a.g(u,rr)*b.g(rr,v);
112  return 1;
113  };
114 
115  int VxM(vektor &vek){
116  if(r!=vek.p)return 0;
117  matice zaloha(r,s);
118  int u,v,rr;
119  for(u=0;u<r;u++)for(v=0;v<s;v++)g(u,v)+=g(u,v);
120  vynulovat();
121  for(u=0;u<r;u++)for(v=0;v<s;v++)for(rr=0;rr<s;rr++)g(u,v)+=vek.v[rr]*zaloha.g(rr,v);
122  return 1;
123  };
124 
125  //DOLU OK
126  void transpose(){
127  t=true;
128  s=R;
129  r=S;
130  };
131  void untranspose(){
132  t=false;
133  s=S;
134  r=R;
135  };
136 
138  int rovna_se (const matice &src) {
139  if(r!=src.r || s!=src.s)
140  return 0;
141 
142  memcpy (this->m, src.m, r*s * sizeof(double));
143 
144  return 1;
145  }
146  int pricist(matice &co){if(r!=co.r || s!=co.s)return 0;int i,j;for(i=0;i<r;i++)for(j=0;j<s;j++)g(i,j)+=co.g(i,j);return 1;}
147  int odecist(matice &co){if(r!=co.r || s!=co.s)return 0;int i,j;for(i=0;i<r;i++)for(j=0;j<s;j++)g(i,j)-=co.g(i,j);return 1;}
148  void print(FILE *soubor){
149  int u,v;
150  for(u=0;u<r;u++){
151  for(v=0;v<s;v++)fprintf(soubor,"%.10lf ",g(u,v));
152  fprintf(soubor,"\n");
153  }
154  fprintf(soubor,"\n");
155  };
156  double Determinant_3x3(){
157  if(r!=3 || s!=3)return 0;
158  return g(0,0)*g(1,1)*g(2,2)-g(2,0)*g(1,1)*g(0,2)+g(0,1)*g(1,2)*g(2,0)+g(1,0)*g(2,1)*g(0,2)-g(0,1)*g(1,0)*g(2,2)-g(0,0)*g(2,1)*g(1,2);
159  };
160  double Determinant_3x3_doplnek(int i,int j){
161  if(r==3 && s==3){
162  int r1,r2,s1,s2;
163  if(r!=3 || s!=3)return 0;
164  if(i==0){r1=1;r2=2;}
165  if(i==1){r1=0;r2=2;}
166  if(i==2){r1=0;r2=1;}
167  if(j==0){s1=1;s2=2;}
168  if(j==1){s1=0;s2=2;}
169  if(j==2){s1=0;s2=1;}
170  return g(r1,s1)*g(r2,s2)-g(r1,s2)*g(r2,s1);
171  }else{
172  printf("\nCHYBA - spatny rozmer matice pro pouziti funkce Determinant_3x3_doplnek\n");
173  return 0.0;
174  }
175  };
176 
177  void inverze_3x3 (matice &d);
178 };
179 
181 void enter();
183 void e(int i);
184 
186 int MaticexVektor(vektor &res, matice &mat,vektor &vek);
188 int RozdilVektoru(vektor &a,vektor &b,vektor &c);
190 void PrintVektor(vektor &vekt);
192 void PrintMatrix(matice &mat,FILE *&soubor);
194 void rotate_vector (vektor &V, double angle);
196 void change_radky(vektor &a, vektor &b);
198 void gaussovaEliminace(matice &mat, vektor &right);
199 
200 // ***********************************************************************************************************
201 // **************** 2D ONLY - END **********************************************************************
202 // ***********************************************************************************************************
203 
204 } // namespace mumech
205 
206 #endif // MUMECH_MATRIX_VECTOR_H
int VxM(vektor &vek)
int rovna_se(const matice &src)
toto jsem ti predelal, pac jsem tam potreboval const
void rovna_se(vektor &co)
Definition: matrix_vector.h:35
void rotate_vector(vektor &V, double angle)
double & g(int radek, int sloupec)
Definition: matrix_vector.h:93
int pricist(vektor &co)
Definition: matrix_vector.h:57
int MaticexVektor(vektor &res, matice &mat, vektor &vek)
double & g(long i)
Definition: matrix_vector.h:38
void PrintMatrix(matice &mat, FILE *&soubor)
double Determinant_3x3_doplnek(int i, int j)
void change_radky(vektor &a, vektor &b)
void print(FILE *soubor)
Definition: matrix_vector.h:39
void define(long n)
Definition: matrix_vector.h:37
int RozdilVektoru(vektor &a, vektor &b, vektor &c)
matice(int radku, int sloupcu)
Definition: matrix_vector.h:74
int odecist(vektor &co)
Definition: matrix_vector.h:58
void define(int radku, int sloupcu)
Definition: matrix_vector.h:82
void print(FILE *soubor)
int nasobeni(matice &a, matice &b)
void PrintVektor(vektor &vekt)
void gaussovaEliminace(matice &m, vektor &right)
void krat(double cislo)
int pricist(matice &co)
double norma() const
void enter()
void deleno(long double cislo)
Definition: matrix_vector.h:59
int odecist(matice &co)
double Determinant_3x3()
void krat(double cislo)
Definition: matrix_vector.h:36
void e(int i)