8#define ABS(X) (X>0 ? X : -X)
14void Matrica::Free(
void)
24void Matrica::Take(
void)
27 CHECK(row>0 && col>0);
28 data=
new double*[row];
30 data[i]=
new double[col];
39Matrica::Matrica(
int _row,
int _col=1)
46void Matrica::Init(
int _row,
int _col)
54Matrica::Matrica(
Matrica &source)
61 memcpy(data[i],source.data[i],col*
sizeof(
double));
69 if(data!=NULL) Free();
74 memcpy(data[i],source.data[i],col*
sizeof(
double));
88 CHECK(row==op2.row && col==op2.col && row>0);
89 for(
int i=0;i<row;i++)
90 for(
int j=0;j<col;j++)
91 R.data[i][j]=data[i][j]+op2.data[i][j];
95void Matrica::operator +=(
Matrica &op2)
97 CHECK(row==op2.row && col==op2.col && row>0);
98 for(
int i=0;i<row;i++)
99 for(
int j=0;j<col;j++)
100 data[i][j] += op2.data[i][j];
103void Matrica::operator -=(
Matrica &op2)
105 CHECK(row==op2.row && col==op2.col && row>0);
106 for(
int i=0;i<row;i++)
107 for(
int j=0;j<col;j++)
108 data[i][j] -= op2.data[i][j];
114 CHECK(row==op2.row && col==op2.col && row>0);
115 for(
int i=0;i<row;i++)
116 for(
int j=0;j<col;j++)
117 R.data[i][j]=data[i][j]-op2.data[i][j];
125 for(
int i=0;i<row;i++)
126 for(
int j=0;j<op2.col;j++)
128 for(
int k=0;k<col;k++)
129 R.data[i][j]+=data[i][k]*op2.data[k][j];
134Matrica Matrica::operator *(
const double &scalar)
137 for(
int i=0;i<row;i++)
138 for(
int j=0;j<col;j++)
139 R.data[i][j]=this->data[i][j]*scalar;
144Matrica Matrica::operator ~(
void)
151 P.data[j][i]=data[i][j];
155Matrica Matrica::operator /(
const double &scalar)
162 R.Set(i,j,data[i][j]/scalar);
167Matrica Matrica::Transpose(
int transpose)
174 P.data[j][i]=data[i][j];
178 i=row; row=col; col=i;
182 data[i][j]=P.data[i][j];
186double Matrica::Get(
int _row,
int _col)
const
188 CHECK(data!=NULL && _row>=0 && _row<row && _col>=0 && _col<col);
189 return data[_row][_col];
192double Matrica::Get(
int _row)
const
194 CHECK(data!=NULL && _row>=0 && _row<row);
195 return data[_row][0];
198double Matrica::Set(
int _row,
int _col,
double value)
200 CHECK(data!=NULL && _row>=0 && _row<=row && _col>=0 && _col<=col);
201 data[_row][_col]=value;
205double Matrica::Set(
int _row,
double value)
207 CHECK(data!=NULL && _row>=0 && _row<=row);
212int Matrica::Load(
const char* fname)
216 CHECK((fp=fopen(fname,
"r"))!=NULL);
217 if(!(fscanf(fp,
"%d %d",&row,&col)!=EOF))
222 for(
int i=0;i<row*col;i++)
223 {
if(!(fscanf(fp,
" %lf ",&value)!=EOF))
225 Set(i/col,i%col,value);
231void Matrica::Save(
const char* fname)
234 if((fp=fopen(fname,
"w+"))==NULL)
236 fprintf(fp,
"%d %d\n",row,col);
237 for(
int i=0;i<row;i++)
238 {
for(
int j=0;j<col;j++)
239 fprintf(fp,
" %g ",data[i][j]);
245void Matrica::SaveLong(
const char* fname)
248 if((fp=fopen(fname,
"w+"))==NULL)
250 fprintf(fp,
"%d %d\n",row,col);
251 for(
int i=0;i<row;i++)
252 {
for(
int j=0;j<col;j++)
253 fprintf(fp,
" %lf ",data[i][j]);
259void Matrica::Show(
void)
262 printf(
"Rows: %d Cols: %d\n",row,col);
265 printf(
"%G\t",data[i][j]);
270void Matrica::Reset(
int _row,
int _col)
272 CHECK(_row>0 && _col>0);
277 for(
int i=0; i<row; i++)
278 for(
int j=0; j<col; j++)
279 this->data[i][j] = 0;
282int Matrica::CopyColumn(
int colnum,
Matrica &V)
285 CHECK(colnum>-1 && colnum<col);
288 V.Set(i,data[i][colnum]);
292int Matrica::SetColumn(
int colnum,
Matrica &v)
295 CHECK(v.GetRow()==row);
296 CHECK(colnum>-1 && colnum<col);
298 data[i][colnum]=v.Get(i);
302double Matrica::Norm(
void)
305 for(
int i=0;i<row;i++)
306 r+= data[i][0]*data[i][0];
310Matrica Matrica::operator+ (
double broj)
312 for(
int i=0; i<row; i++)
313 for(
int j=0; j<col; j++)
322void SLAJ::Load_A(
char* fname)
327void SLAJ::Load_b(
char* fname)
332void SLAJ::Save_A(
char* fname)
337void SLAJ::Save_b(
char* fname)
344 A.Reset(_A.GetRow(),_A.GetCol());
350 CHECK(_b.GetCol()==1);
354void SLAJ::GetSolution(
Matrica &X)
360 X.data[i][0]=b.data[i][0];
387 X.data[i][0]=b.data[P[i]][0];
394 static int i,j,dim,poc=1;
395 static Matrica R(6,6), RR(6,6), I(6,6), c(6,1);
397 CHECK((dim=M.GetCol()) == M.GetRow());
424 RR.data[i][j]=R.data[P[i]][j];
430int LUdek::Decompose(
void)
445 if(ABS(A.Get(P[j],i))>ABS(A.Get(P[p],i)))
455 A.data[P[j]][i]=A.data[P[j]][i]/A.data[P[i]][i];
458 A.data[P[j]][k]-= A.data[P[j]][i]*A.data[P[i]][k];
464int LUdek::ForwardSubst(
void)
470 b.data[P[j]][0]-= A.data[P[j]][i]*b.data[P[i]][0];
474int LUdek::BackwardSubst(
void)
479 b.data[P[i]][0] /= A.data[P[i]][i];
482 b.data[P[j]][0] -= A.data[P[j]][i]*b.data[P[i]][0];