-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlu.cpp
More file actions
127 lines (104 loc) · 2.67 KB
/
lu.cpp
File metadata and controls
127 lines (104 loc) · 2.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <fstream>
#include <time.h>
#include <stdlib.h>
using namespace std;
// MATRICE OPERATIONS ---------------------------------------------------------------------------------------------------------------------------------------------------
// MATRICE INITIALIZATION -------------------------------------
double** zero(int n){
double** res = new double*[n];
int i,j;
for (i = 0; i < n; ++i){
res[i]= new double[n];
for (j = 0; j < n; ++j){
res[i][j] = 0;
}
}
return res;
}
double** eye(int n){
double** res = zero(n);
int i;
for (i = 0; i < n; ++i){
res[i][i]=1;
}
return res;
}
double** randM(int n){
double** res = zero(n);
int i,j;
for (i = 0; i < n; ++i){
for (j = 0; j < n; ++j){
double randd = (double)rand() / RAND_MAX;
res[i][j] = randd;
}
}
return res;
}
// OPERATIONS -----------------------------------------------
void mmx(double* v, double* y, double x, int n){
int i;
for (i = 0; i < n; ++i){
v[i]=v[i]-y[i]*x;
}
}
void div(double* v, double x, int n){
int i;
for (i = 0; i < n; ++i){
v[i]=v[i]/x;
}
}
// SOLVER ---------------------------------------------------------------------------------------------------------------------------------------------------------------
double** solLow(double**L, double** b, int n){
double** res = zero(n);
double* lineI;
int i,j;
for (i = 0; i < n; ++i){
lineI = b[i];
for (j = 0; j < i; ++j){
mmx(lineI,res[j], L[i][j], n);
}
res[i]=lineI;
}
return res;
}
double** solUP(double**L, double** b, int n){
double** res = L;
double* lineI;
int i,j;
for (i = n-1; i >=0; --i){
lineI=b[i];
for (j = n-1; j > i; --j){
mmx(lineI,res[j], L[i][j], n);
}
div(lineI,L[i][i],n);
res[i]=lineI;
}
return res;
}
//LU WITHOUT PIVOT ------------------------------------------------------------------------------------------------------------------------------------------------------
double** luc(double** A, double** B, int n){
double** L = eye(n);
int i,k,j;
for (i = 0; i < n; ++i){
for (k = i+1; k < n; ++k){
L[k][i]=A[k][i]/A[i][i];
}
for (j = i+1; j < n; ++j){
mmx(A[j],A[i], L[j][i], n);
}
}
return solUP(A,solLow(L,B,n),n);
}
// MAIN -----------------------------------------------------------------------------------------------------------------------------------------------------------------
int main(int argi, char *argc[]) {
int taille = atoi(argc[1]);
double** y = randM(taille);
double** m = randM(taille);
clock_t tStartLU = clock();
double** res = luc(m, y, taille);
printf("Time taken for my solution with LU: %.2fs\n", (double)(clock() - tStartLU)/CLOCKS_PER_SEC);
return 0;
}
//icc -Ofast -o lu lu.cpp
//./lu 1000