Algorithms_in_C  1.0.0
Set of algorithms implemented in C.
lu_decompose.c File Reference

LU decomposition of a square matrix More...

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
Include dependency graph for lu_decompose.c:

Functions

int lu_decomposition (double **A, double **L, double **U, int mat_size)
 
void display (double **A, int N)
 
int main (int argc, char **argv)
 

Detailed Description

LU decomposition of a square matrix

Author
Krishna Vedala

Function Documentation

◆ display()

void display ( double **  A,
int  N 
)

Function to display square matrix

67 {
68  for (int i = 0; i < N; i++)
69  {
70  for (int j = 0; j < N; j++)
71  {
72  printf("% 3.3g \t", A[i][j]);
73  }
74  putchar('\n');
75  }
76 }

◆ lu_decomposition()

int lu_decomposition ( double **  A,
double **  L,
double **  U,
int  mat_size 
)

Perform LU decomposition on matrix

Parameters
[in]Amatrix to decompose
[out]Loutput L matrix
[out]Uoutput U matrix
[in]mat_sizeinput square matrix size
21 {
22  int row, col, j;
23 
24  // regularize each row
25  for (row = 0; row < mat_size; row++)
26  {
27  // Upper triangular matrix
28 #ifdef _OPENMP
29 #pragma omp for
30 #endif
31  for (col = row; col < mat_size; col++)
32  {
33  // Summation of L[i,j] * U[j,k]
34  double lu_sum = 0.;
35  for (j = 0; j < row; j++) lu_sum += L[row][j] * U[j][col];
36 
37  // Evaluate U[i,k]
38  U[row][col] = A[row][col] - lu_sum;
39  }
40 
41  // Lower triangular matrix
42 #ifdef _OPENMP
43 #pragma omp for
44 #endif
45  for (col = row; col < mat_size; col++)
46  {
47  if (row == col)
48  {
49  L[row][col] = 1.;
50  continue;
51  }
52 
53  // Summation of L[i,j] * U[j,k]
54  double lu_sum = 0.;
55  for (j = 0; j < row; j++) lu_sum += L[col][j] * U[j][row];
56 
57  // Evaluate U[i,k]
58  L[col][row] = (A[col][row] - lu_sum) / U[row][row];
59  }
60  }
61 
62  return 0;
63 }

◆ main()

int main ( int  argc,
char **  argv 
)

Main function

80 {
81  int mat_size = 3; // default matrix size
82  const int range = 10;
83  const int range2 = range >> 1;
84 
85  if (argc == 2)
86  mat_size = atoi(argv[1]);
87 
88  srand(time(NULL)); // random number initializer
89 
90  /* Create a square matrix with random values */
91  double **A = (double **)malloc(mat_size * sizeof(double *));
92  double **L = (double **)malloc(mat_size * sizeof(double *)); // output
93  double **U = (double **)malloc(mat_size * sizeof(double *)); // output
94  for (int i = 0; i < mat_size; i++)
95  {
96  // calloc so that all valeus are '0' by default
97  A[i] = (double *)calloc(mat_size, sizeof(double));
98  L[i] = (double *)calloc(mat_size, sizeof(double));
99  U[i] = (double *)calloc(mat_size, sizeof(double));
100  for (int j = 0; j < mat_size; j++)
101  /* create random values in the limits [-range2, range-1] */
102  A[i][j] = (double)(rand() % range - range2);
103  }
104 
105  lu_decomposition(A, L, U, mat_size);
106 
107  printf("A = \n");
108  display(A, mat_size);
109  printf("\nL = \n");
110  display(L, mat_size);
111  printf("\nU = \n");
112  display(U, mat_size);
113 
114  /* Free dynamically allocated memory */
115  for (int i = 0; i < mat_size; i++)
116  {
117  free(A[i]);
118  free(L[i]);
119  free(U[i]);
120  }
121  free(A);
122  free(L);
123  free(U);
124 
125  return 0;
126 }
Here is the call graph for this function:
L
Definition: list.h:8
data
Definition: prime_factoriziation.c:25
N
#define N
Definition: sol1.c:109
lu_decomposition
int lu_decomposition(double **A, double **L, double **U, int mat_size)
Definition: lu_decompose.c:20
display
void display(double **A, int N)
Definition: lu_decompose.c:66