-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMathHelpers.c
More file actions
69 lines (59 loc) · 1.57 KB
/
MathHelpers.c
File metadata and controls
69 lines (59 loc) · 1.57 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
#include "MathHelpers.h"
#include "MatrixAndVectorOps.h"
#include <stdlib.h>
#include "eigen.h"
#include <stdio.h>
#include <math.h>
#include <float.h>
#include "sparse.h"
double CalculateEigenvalue(double** matrix, double* vector, int length)
{
double* vec;
double upper,lower;
vec = (double*)malloc(length* sizeof(double));
multiplyMatrixAndVector(matrix,vector,vec,length);
upper = MultiplyVectorAndVector(vec,vector,length);
lower = MultiplyVectorAndVector(vector,vector,length);
free(vec);
return (upper/lower);
}
double CalculateLeadingEigenpair(double** matrix,double* init_vector, int length)
{
double norm1;
double eigen_val;
norm1 = Calculate1norm(matrix,length);
CalculateNewMatrix(matrix,norm1,length);
PowerIterationsWithSparse(matrix,init_vector,length);
eigen_val = CalculateEigenvalue(matrix,init_vector,length);
eigen_val = eigen_val - norm1;
CalculateNewMatrix(matrix,-norm1,length);
return eigen_val;
}
double Calculate1norm(double** matrix,int length)
{
double* arr;
double max;
int i, j, k;
max = -DBL_MAX;
arr = (double*)malloc(length* sizeof(double));
for (i = 0; i < length; ++i) {
for (j = 0; j < length; ++j) {
arr[j] += fabs(matrix[i][j]);
}
}
for (k = 0; k < length; ++k) {
if(arr[k] > max){
max = arr[k];
}
}
free(arr);
return max;
}
int CalculateNewMatrix(double** matrix, double norm ,int length)
{
int i;
for (i = 0; i < length; ++i) {
matrix[i][i] += norm;
}
return EXIT_SUCCESS;
}