-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhouse.c
111 lines (104 loc) · 2.44 KB
/
house.c
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
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
double * house(const double x[], const int m, int *beta)
{
double sig = 0, *vec;
vec = (double *)malloc(sizeof(double) * m);
vec[0] = 1;
int i;
for(i = 1; i < m; i++)
{
sig += x[i] * x[i];
vec[i] = x[i];
}
if(sig == 0)
{
if(x[0] >= 0)
{
*beta = 0;
return vec;
}
else
{
*beta = -2;
return vec;
}
}
else
{
double mu = sqrt((x[0]*x[0]) + sig);
if(x[0] <= 0)
{
vec[0] = x[0] - mu;
}
else
{
vec[0] = (- sig) / (x[0] + mu);
}
*beta = (2*vec[0]*vec[0]) / (sig + (vec[0]*vec[0]));
for(i = 0; i < m; i++)
vec[i] = vec[i] / vec[0];
return vec;
}
}
void mat_mul_brute(int **A, int **B, int **C, int n)
{
for (int i = 0; i < n; i++)
{
for (int k = 0; k < n; k++)
{
for (int j = 0; j < n; j++)
{
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
void hessenberg(int mat[][], int n)
{
int k, j, i, m;
double *v, b, *temp, **temp_mat;
for(k = 1; k < n - 2; k++)
{
temp = (double *)malloc(sizeof(double)*(n-k));
for(j = 0; j < (n-k); j++)
temp[j] = mat[j+k][k-1];
v = house(temp, n-k, &b);
temp_mat = (int**)malloc(sizeof(int*)*(n-k));
for(i = 0; i < n - k; i++)
{
temp_mat[i] = (int *) malloc(sizeof(int)*(n-k+1));
}
for(i = 0; i < n - k ; i++)
for(j = 0; j < n - k + 1; j++)
for(m = 0; m < n - k; m++)
{
temp_mat[i][j] += ((m==i?1:0) - (b*v[i]*v[m])) * (mat[m+k][j+k-1]);
}
for(i = 0; i < n - k ; i++)
for(j = 0; j < n - k + 1; j++)
mat[i+k][j+k-1] = temp_mat[i][j];
for(i = 0; i < n - k; i++)
{
free(temp_mat[i]);
}
free(temp_mat);
free(v);
temp_mat = (double**)malloc(sizeof(double *)*n);
for(i = 0; i < n; i++)
{
temp_mat = (double*)malloc(sizeof(double)*(n-k));
}
for(i = 0; i < n; i++)
for(j = 0; j < n - k; j++)
for(m = 0; m < n - k; m++)
{
}
temp
}
}
int main()
{
return 0;
}