430 likes | 549 Vues
This chapter provides an in-depth look at the implementation of PA=LU decomposition in C, focusing on full matrix data structures. It covers essential topics, including setting up a Visual Studio 2005 project, compiling on a Linux machine, and differences between row-major and column-major indexing. The implementation details are supported by practical examples demonstrating the construction of lower and upper triangular matrices, using permutation vectors, and performing matrix operations. Exercises are included to solidify understanding.
E N D
Chapter 15 C-implementationPA = LU Speaker: Lung-Sheng Chien
OutLine • Data structure of full matrix • Implementation of PA=LU • Visual Studio 2005: How To • Linux machine: How to compile
row-major versus col-major Logical index : 2D col-major based 6 -2 2 4 12 -8 6 10 3 -13 9 3 6 -2 2 4 -6 4 1 -18 12 -8 6 10 3 -13 9 3 row-major based -6 4 1 -18 6 -2 2 4 12 -8 6 10 We choose col-major representation 3 -13 9 3 -6 4 1 -18
col-major: C starts index from 0 0 6 1 matrix.h 2 12 3 3 -6 4 -2 5 -8 6 -13 7 col-major based 4 8 legal 2 9 6 10 9 11 1 12 is useless 1 6 -2 2 4 13 4 is forbidden 2 12 -8 6 10 10 14 3 3 -13 9 3 3 15 -6 4 1 -18 -18 16
Relaxation for high precision package global.h Large 1D array, “int” is 4-byte, only supports up to 2G elements We use col-major, however you can implement both. http://crd.lbl.gov/~dhbailey/mpdist/
Data structure of matrix and its method matrix.h constructor (建構子): zeros Arithmetic: matvec, matsub, norm 1 4 destructor (解構子): dealloc I/O: disp 2 5 Index rule: we do it explicitly 3
matrix.cpp constructor [1] empty handler 1 1 set parameter 5 2 2 3 contiguous memory block 4 3 6 1 2 12 3 3 5
matrix.cpp constructor [2] 0 6 1 4 2 12 3 3 -6 4 low -2 5 -8 6 1 -13 7 high 4 8 2 2 9 3 6 10 9 11 4 4 1 12 pointer arithmetic 13 4 10 14 3 15 5 -18 16
destructor 0 matrix.cpp 6 1 2 12 3 3 -6 1 4 -2 5 2 -8 6 3 -13 7 4 free pointer array 1 8 2 free physic storage 2 9 6 10 9 11 free matrix handler 1 12 3 13 4 10 14 3 15 -18 16
Input/Output matrix.cpp 6 -2 2 4 12 -8 6 10 Show in standard form: human readable 3 -13 9 3 -6 4 1 -18
Simple driver main.cpp Execution result
duplicate of a matrix / vector matrix.cpp verification We require matrix handler to verify configuration, this is very important for debugging.
y = Ax matrix.cpp Outer-product formulation
Matrix / vector norm matrix.cpp Maximum of absolute column sum Maximum of absolute row sum 2-norm is difficult to compute, we will discuss this later
OutLine • Data structure of full matrix • Implementation of PA=LU • Visual Studio 2005: How To • Linux machine: How to compile
Algorithm ( PA = LU ) [1] Given full matrix , construct initial lower triangle matrix use permutation vector to record permutation matrix verification (1) we store lower triangle matrix L into storage of matrix A (2) The reason to construct type int_matrix is for permutation matrix P, since we can check dimension between A and P.
Algorithm ( PA = LU ) [2] let , and Note that P is a column vector for we have compute update original matrix stores in lower triangle matrix
Algorithm ( PA = LU ) [3] such that 1 find a , NOT efficient 2 swap row and row define permutation matrix , we have then after swapping rows
Algorithm ( PA = LU ) [4] 3 compute for if then by swapping and compute 4 then endif
Algorithm ( PA = LU ) [5] we store lower triangle matrix into storage of matrix A, this code is different from code in MATLAB. 5 decompose How to compute efficiently?
Algorithm ( PA = LU ) [6] component-wise update : Observation: we implement with column-major form, column-wise update is good
Algorithm ( PA = LU ) [7] where by updating by updating matrix (recursion is done) then endfor
Algorithm ( PA = LU ) [8] 6 -2 2 4 1 12 -8 6 10 12 -8 6 10 0.25 1 -11 7.5 0.5 3 -13 9 3 -0.5 0 1 4 -13 -6 4 1 -18 0.5 -2/11 1/11 1 3/11 Store L and U into original A Question 1: how to write down a test driver Question 2: how to do backward and forward
Test driver [1] main.cpp 6 -2 2 4 12 -8 6 10 3 -13 9 3 -6 4 1 -18 1 Remember to duplicate matrix A since A is modified when execute LU decomposition.
Test driver [2] 2 5 6 3 7 8 4 Linear solver: do backward and forward 5 -6.9306 17.9583 26.5833 6 7.3333
Exercise • Implement PA = LU. • Implement forward and backward. • Write a driver to test your linear solver. • Any other implementation for full matrix?
OutLine • Data structure of full matrix • Implementation of PA=LU • Visual Studio 2005: How To • Linux machine: How to compile
Visual Studio 2005: How To [1] Create a new project: File Project
Visual Studio 2005: How To [2] Choose Win32 console application, this is the same as what we do in VC 6.0 Project name: vc 2005 will create a directory, the same name as project name
Visual Studio 2005: How To [3] We choose “next” bottom to set an empty project, DO NOT press Finish bottom.
Visual Studio 2005: How To [4] Empty project, this is very important
Visual Studio 2005: How To [5] 3 Add “main.cpp” to this project Empty project 1 Add new item (source file or header file) to this project 2
Visual Studio 2005: How To [6] Write source code “hello world” Compile: Build Build matrix
Visual Studio 2005: How To [7] Result of compilation, including linking: success Additional directory “debug” appears Executable file “matrix.exe” in this debug directory
Visual Studio 2005: How To [8] Execute matrix.exe: Debug Start Without Debugging Execution in VC 6.0
Visual Studio 2005: How To [9] Suppose we want to add several source files into this project. 1 Copy files into directory /matrix/matrix Add source files into the project by Project Add Existing item 2
Visual Studio 2005: How To [10] Select the files you want to add All souce files in this project
Visual Studio 2005: How To [11] Remember that executable file is in directory /matrix/debug, you can use command window to execute matrix.exe
Visual Studio 2005: How To [12] There is another “debug” directory in /matrix/matrix, this directory contains object files, no executable file
OutLine • Data structure of full matrix • Implementation of PA=LU • Visual Studio 2005: How To • Linux machine: How to compile
Linux machine: How to compile [1] Suppose we put all source file into directory matrix_constructor and upload to workstation. 1 Remove all VC related files. 2 use command “qmake -project” to generate project file 3
Linux machine: How to compile [2] use command “qmake matrix_constructor.pro” to generate Makefile Later on, we will introduce Makefile 4 use command “make” to compile your codes and generate executable file 5
Linux machine: How to compile [3] Execute executable file by “./matrix_constructor” 6