96 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|    LAPACKE Example : Calling DGELS using col-major layout
 | |
|    =====================================================
 | |
| 
 | |
|    The program computes the solution to the system of linear
 | |
|    equations with a square matrix A and multiple
 | |
|    right-hand sides B, where A is the coefficient matrix
 | |
|    and b is the right-hand side matrix:
 | |
| 
 | |
|    Description
 | |
|    ===========
 | |
| 
 | |
|    In this example, we wish solve the least squares problem min_x || B - Ax ||
 | |
|    for two right-hand sides using the LAPACK routine DGELS. For input we will
 | |
|    use the 5-by-3 matrix
 | |
| 
 | |
|          ( 1  1  1 )
 | |
|          ( 2  3  4 )
 | |
|      A = ( 3  5  2 )
 | |
|          ( 4  2  5 )
 | |
|          ( 5  4  3 )
 | |
|     and the 5-by-2 matrix
 | |
| 
 | |
|          ( -10 -3 )
 | |
|          (  12 14 )
 | |
|      B = (  14 12 )
 | |
|          (  16 16 )
 | |
|          (  18 16 )
 | |
|     We will first store the input matrix as a static C two-dimensional array,
 | |
|     which is stored in col-major layout, and let LAPACKE handle the work space
 | |
|     array allocation. The LAPACK base name for this function is gels, and we
 | |
|     will use double precision (d), so the LAPACKE function name is LAPACKE_dgels.
 | |
| 
 | |
|     lda=5 and ldb=5. The output for each right hand side is stored in b as
 | |
|     consecutive vectors of length 3. The correct answer for this problem is
 | |
|     the 3-by-2 matrix
 | |
| 
 | |
|          ( 2 1 )
 | |
|          ( 1 1 )
 | |
|          ( 1 2 )
 | |
| 
 | |
|     A complete C program for this example is given below. Note that when the arrays
 | |
|      are passed to the LAPACK routine, they must be dereferenced, since LAPACK is
 | |
|       expecting arrays of type double *, not double **.
 | |
| 
 | |
| 
 | |
|    LAPACKE Interface
 | |
|    =================
 | |
| 
 | |
|    LAPACKE_dgels (col-major, high-level) Example Program Results
 | |
| 
 | |
|   -- LAPACKE Example routine (version 3.7.0) --
 | |
|   -- LAPACK is a software package provided by Univ. of Tennessee,    --
 | |
|   -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
 | |
|      December 2016
 | |
| 
 | |
| */
 | |
| /* Calling DGELS using col-major layout */
 | |
| 
 | |
| /* Includes */
 | |
| #include <stdio.h>
 | |
| #include <lapacke.h>
 | |
| #include "lapacke_example_aux.h"
 | |
| 
 | |
| /* Main program */
 | |
| int main (int argc, const char * argv[])
 | |
| {
 | |
|    /* Locals */
 | |
|    double A[5][3] = {{1,2,3},{4,5,1},{3,5,2},{4,1,4},{2,5,3}};
 | |
|    double b[5][2] = {{-10,12},{14,16},{18,-3},{14,12},{16,16}};
 | |
|    lapack_int info,m,n,lda,ldb,nrhs;
 | |
| 
 | |
|    /* Initialization */
 | |
|    m = 5;
 | |
|    n = 3;
 | |
|    nrhs = 2;
 | |
|    lda = 5;
 | |
|    ldb = 5;
 | |
| 
 | |
|    /* Print Entry Matrix */
 | |
|    print_matrix_colmajor( "Entry Matrix A", m, n, *A, lda );
 | |
|    /* Print Right Rand Side */
 | |
|    print_matrix_colmajor( "Right Hand Side b", n, nrhs, *b, ldb );
 | |
|    printf( "\n" );
 | |
| 
 | |
|    /* Executable statements */
 | |
|    printf( "LAPACKE_dgels (col-major, high-level) Example Program Results\n" );
 | |
|    /* Solve least squares problem*/
 | |
|    info = LAPACKE_dgels(LAPACK_COL_MAJOR,'N',m,n,nrhs,*A,lda,*b,ldb);
 | |
| 
 | |
|    /* Print Solution */
 | |
|    print_matrix_colmajor( "Solution", n, nrhs, *b, ldb );
 | |
|    printf( "\n" );
 | |
|    exit( info );
 | |
| } /* End of LAPACKE_dgels Example */
 |