00001
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef _GAN_VEC_GEN_H
00030 #define _GAN_VEC_GEN_H
00031
00032 #include <stdlib.h>
00033 #include <stdio.h>
00034 #include <stdarg.h>
00035 #include <gandalf/common/misc_defs.h>
00036 #include <gandalf/common/misc_error.h>
00037
00038 #ifdef __cplusplus
00039 extern "C" {
00040 #endif
00041
00057 struct Gan_Matrix;
00058
00060 typedef struct Gan_Vector
00061 {
00062
00063 unsigned long rows;
00064
00065
00066 double *data;
00067
00068
00069 size_t data_size;
00070
00071
00072 Gan_Bool data_alloc;
00073
00074
00075 Gan_Bool struct_alloc;
00076 } Gan_Vector;
00077
00078 #define GAN_VECTOR_STRUCT_DEFINED
00079
00080 #include <gandalf/linalg/mat_gen.h>
00081 #include <gandalf/linalg/mat_square.h>
00082
00083
00084 Gan_Vector *gan_vec_form_gen ( Gan_Vector *x, unsigned long rows,
00085 double *data, size_t data_size );
00086 void gan_vec_free ( Gan_Vector *x );
00087 Gan_Vector *gan_vec_set_size ( Gan_Vector *x, unsigned long rows );
00088 Gan_Vector *gan_vec_fill_va ( Gan_Vector *x, unsigned long rows, ... );
00089 Gan_Vector *gan_vec_fill_vap ( Gan_Vector *x, unsigned long rows,
00090 va_list *aptr );
00091 Gan_Vector *gan_vec_fill_const_q ( Gan_Vector *x, unsigned long rows,
00092 double value );
00093 Gan_Bool gan_vec_read_va ( const Gan_Vector *x, unsigned long rows, ... );
00094 Gan_Vector *gan_vec_copy_q ( const Gan_Vector *x, Gan_Vector *y );
00095 Gan_Vector *gan_vec_scale_q ( Gan_Vector *x, double a, Gan_Vector *y );
00096 Gan_Vector *gan_vec_add_q ( Gan_Vector *x, Gan_Vector *y, Gan_Vector *z );
00097 Gan_Vector *gan_vec_sub_q ( Gan_Vector *x, Gan_Vector *y, Gan_Vector *z );
00098 double gan_vec_dot ( const Gan_Vector *x, const Gan_Vector *y );
00099 struct Gan_Matrix *gan_vec_outer_q ( const Gan_Vector *x, const Gan_Vector *y,
00100 struct Gan_Matrix *A );
00101 struct Gan_SquMatrix *gan_vec_outer_sym_q ( const Gan_Vector *x,
00102 struct Gan_SquMatrix *A );
00103 Gan_Vector *gan_vec_insert ( Gan_Vector *x, unsigned long rx,
00104 const Gan_Vector *y, unsigned long ry,
00105 unsigned long rows );
00106 void gan_vec_free_va ( Gan_Vector *x, ... );
00107 Gan_Vector *gan_vec_insert_mat ( Gan_Vector *x, unsigned long rx,
00108 const struct Gan_Matrix *A, unsigned long ra,
00109 unsigned long ca,
00110 unsigned long rows );
00111 Gan_Vector *gan_vec_insert_matT ( Gan_Vector *x, unsigned long rx,
00112 const struct Gan_Matrix *A, unsigned long ra,
00113 unsigned long ca,
00114 unsigned long rows );
00115 Gan_Bool gan_vec_fprint ( FILE *fp, const Gan_Vector *x, const char *prefix,
00116 int indent, const char *fmt );
00117 Gan_Vector *gan_vec_fscanf_q ( FILE *fp, Gan_Vector *x,
00118 char *prefix, int prefix_len );
00119 Gan_Bool gan_vec_fwrite ( FILE *fp, const Gan_Vector *x, gan_uint32 magic_number );
00120 Gan_Vector *gan_vec_fread_q ( FILE *fp, Gan_Vector *x,
00121 gan_uint32 *magic_number );
00122
00123 #define Gan_Matrix struct Gan_Matrix
00124 #define Gan_SquMatrix struct Gan_SquMatrix
00125
00139 Gan_Vector *gan_vec_alloc ( unsigned long rows );
00140
00152 Gan_Vector *gan_vec_form ( Gan_Vector *x, unsigned long rows );
00153
00168 Gan_Vector *gan_vec_form_data ( Gan_Vector *x, unsigned long rows,
00169 void *data, size_t data_size );
00170
00186 Gan_Bool gan_vec_set_el ( Gan_Vector *x, unsigned i, double value );
00187
00193 double gan_vec_get_el ( const Gan_Vector *x, unsigned i );
00194
00201 Gan_Bool gan_vec_inc_el ( Gan_Vector *x, unsigned i, double value );
00202
00209 Gan_Bool gan_vec_dec_el ( Gan_Vector *x, unsigned i, double value );
00210
00227 Gan_Bool gan_vec_print ( const Gan_Vector *x,
00228 const char *prefix, int indent, const char *fmt );
00229
00250 Gan_Vector *gan_vec_fill_const_s ( unsigned long rows, double value );
00251
00262 Gan_Vector *gan_vec_fill_zero_q ( Gan_Vector *x, unsigned long rows );
00263
00272 Gan_Vector *gan_vec_fill_zero_s ( unsigned long rows );
00273
00288 Gan_Vector *gan_vec_copy_s ( const Gan_Vector *x );
00289
00304 Gan_Vector *gan_vec_scale_s ( Gan_Vector *x, double a );
00305
00312 Gan_Vector *gan_vec_scale_i ( Gan_Vector *x, double a );
00313
00321 Gan_Vector *gan_vec_divide_q ( Gan_Vector *x, double a, Gan_Vector *y );
00322
00328 Gan_Vector *gan_vec_divide_s ( Gan_Vector *x, double a );
00329
00336 Gan_Vector *gan_vec_divide_i ( Gan_Vector *x, double a );
00337
00343 Gan_Vector *gan_vec_negate_q ( Gan_Vector *x, Gan_Vector *y );
00344
00350 Gan_Vector *gan_vec_negate_s ( Gan_Vector *x );
00351
00357 Gan_Vector *gan_vec_negate_i ( Gan_Vector *x );
00358
00375 Gan_Vector *gan_vec_add_s ( Gan_Vector *x, Gan_Vector *y );
00376
00384 Gan_Vector *gan_vec_add_i1 ( Gan_Vector *x, Gan_Vector *y );
00385
00393 Gan_Vector *gan_vec_add_i2 ( Gan_Vector *x, Gan_Vector *y );
00394
00401 Gan_Vector *gan_vec_increment ( Gan_Vector *x, Gan_Vector *y );
00402
00419 Gan_Vector *gan_vec_sub_s ( Gan_Vector *x, Gan_Vector *y );
00420
00428 Gan_Vector *gan_vec_sub_i1 ( Gan_Vector *x, Gan_Vector *y );
00429
00437 Gan_Vector *gan_vec_sub_i2 ( Gan_Vector *x, Gan_Vector *y );
00438
00445 Gan_Vector *gan_vec_decrement ( Gan_Vector *x, Gan_Vector *y );
00446
00462 Gan_Matrix *gan_vec_outer_s ( const Gan_Vector *x, const Gan_Vector *y );
00463
00471 Gan_SquMatrix *gan_vec_outer_sym_s ( const Gan_Vector *x );
00472
00488 double gan_vec_sqrlen ( const Gan_Vector *x );
00489
00507 Gan_Bool gan_vec_same_size ( const Gan_Vector *x, const Gan_Vector *y );
00508
00524 size_t gan_vec_data_size ( unsigned long rows );
00525
00547 Gan_Vector *gan_vec_fscanf_s ( FILE *fp, const char *prefix, int prefix_len );
00548
00558 Gan_Vector *gan_vec_fread_s ( FILE *fp, gan_uint32 *magic_number );
00559
00564 #undef Gan_Matrix
00565 #undef Gan_SquMatrix
00566
00567
00568 Gan_Bool gan_vec_realloc ( Gan_Vector *x, unsigned long rows );
00569 #ifndef NDEBUG
00570 void gan_vec_db ( const Gan_Vector *x );
00571 #endif
00572
00585 #ifdef __cplusplus
00586 }
00587 #endif
00588
00589 #endif