00001
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef _GAN_MAT_GEN_H
00030 #define _GAN_MAT_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 #include <gandalf/linalg/linalg_defs.h>
00038
00039 #ifdef __cplusplus
00040 extern "C" {
00041 #endif
00042
00058 struct Gan_SquMatrix;
00059
00061 typedef struct Gan_Matrix
00062 {
00063
00064 unsigned long rows, cols;
00065
00066
00067 double *data;
00068
00069
00070 size_t data_size;
00071
00072
00073 Gan_Bool data_alloc;
00074
00075
00076 Gan_Bool struct_alloc;
00077 } Gan_Matrix;
00078
00079 #define GAN_MATRIX_STRUCT_DEFINED
00080
00081 #include <gandalf/linalg/vec_gen.h>
00082 #include <gandalf/linalg/mat_square.h>
00083
00084 void gan_mat_free ( Gan_Matrix *A );
00085 Gan_Matrix *gan_mat_set_dims ( Gan_Matrix *A,
00086 unsigned long rows, unsigned long cols );
00087 Gan_Matrix *gan_mat_fill_va ( Gan_Matrix *A,
00088 unsigned long rows, unsigned long cols, ... );
00089 Gan_Matrix *gan_mat_fill_vap ( Gan_Matrix *A,
00090 unsigned long rows, unsigned long cols,
00091 va_list *aptr );
00092 Gan_Matrix *gan_mat_fill_const_q ( Gan_Matrix *A,
00093 unsigned long rows, unsigned long cols,
00094 double value );
00095 Gan_Bool gan_mat_read_va ( const Gan_Matrix *A,
00096 unsigned long rows, unsigned long cols, ... );
00097 Gan_Matrix *gan_mat_copy_q ( const Gan_Matrix *A, Gan_Matrix *B );
00098 Gan_Matrix *gan_mat_scale_q ( Gan_Matrix *A, double a, Gan_Matrix *B );
00099 Gan_Matrix *gan_mat_divide_q ( Gan_Matrix *A, double a, Gan_Matrix *B );
00100 Gan_Matrix *gan_mat_tpose_q ( Gan_Matrix *A, Gan_Matrix *B );
00101 Gan_Matrix *gan_mat_insertsym ( Gan_Matrix *A,
00102 unsigned long rA, unsigned long cA,
00103 const struct Gan_SquMatrix *B,
00104 unsigned long rB, unsigned long cB,
00105 unsigned long rows , unsigned long cols );
00106 Gan_Bool gan_mat_is_zero ( Gan_Matrix *A );
00107 void gan_mat_free_va ( Gan_Matrix *A, ... );
00108 Gan_Matrix *gan_mat_extract_q ( const Gan_Matrix *A,
00109 unsigned long r0, unsigned long c0,
00110 unsigned long rows, unsigned long cols,
00111 Gan_Matrix *B );
00112 double gan_mat_sumsqr ( const Gan_Matrix *A );
00113 double gan_mat_Fnorm ( const Gan_Matrix *A );
00114 Gan_Matrix *gan_mat_invert_q ( const Gan_Matrix *A, Gan_Matrix *B );
00115 Gan_Bool gan_mat_fprint ( FILE *fp, const Gan_Matrix *A, const char *prefix,
00116 unsigned indent, const char *fmt );
00117 Gan_Matrix *gan_mat_fscanf_q ( FILE *fp, Gan_Matrix *A,
00118 char *prefix, int prefix_len );
00119 Gan_Bool gan_mat_fwrite ( FILE *fp, const Gan_Matrix *A, gan_uint32 magic_number );
00120 Gan_Matrix *gan_mat_fread_q ( FILE *fp, Gan_Matrix *A,
00121 gan_uint32 *magic_number );
00122
00123 #define Gan_SquMatrix struct Gan_SquMatrix
00124
00138 Gan_Matrix *gan_mat_alloc ( unsigned long rows, unsigned long cols );
00139
00151 Gan_Matrix *gan_mat_form ( Gan_Matrix *A,
00152 unsigned long rows, unsigned long cols );
00153
00168 Gan_Matrix *gan_mat_form_data ( Gan_Matrix *A,
00169 unsigned long rows, unsigned long cols,
00170 double *data, size_t data_size );
00171
00187 Gan_Bool gan_mat_set_el ( Gan_Matrix *A, unsigned i, unsigned j, double value);
00188
00194 double gan_mat_get_el ( const Gan_Matrix *A, unsigned i, unsigned j );
00195
00202 Gan_Bool gan_mat_inc_el ( Gan_Matrix *A, unsigned i, unsigned j, double value);
00203
00210 Gan_Bool gan_mat_dec_el ( Gan_Matrix *A, unsigned i, unsigned j, double value);
00211
00228 Gan_Bool gan_mat_print ( const Gan_Matrix *A,
00229 const char *prefix, int indent, const char *fmt );
00230
00252 Gan_Matrix *gan_mat_fill_const_s ( unsigned long rows, unsigned long cols,
00253 double value );
00254
00265 Gan_Matrix *gan_mat_fill_zero_q ( Gan_Matrix *A,
00266 unsigned long rows, unsigned long cols );
00267
00279 Gan_Matrix *gan_mat_fill_zero_s ( unsigned long rows, unsigned cols );
00280
00295 Gan_Matrix *gan_mat_copy_s ( const Gan_Matrix *A );
00296
00311 Gan_Matrix *gan_mat_scale_s ( Gan_Matrix *A, double a );
00312
00318 Gan_Matrix *gan_mat_scale_i ( Gan_Matrix *A, double a );
00319
00325 Gan_Matrix *gan_mat_divide_s ( Gan_Matrix *A, double a );
00326
00332 Gan_Matrix *gan_mat_divide_i ( Gan_Matrix *A, double a );
00333
00339 Gan_Matrix *gan_mat_negate_q ( Gan_Matrix *A, Gan_Matrix *B );
00340
00346 Gan_Matrix *gan_mat_negate_s ( Gan_Matrix *A );
00347
00353 Gan_Matrix *gan_mat_negate_i ( Gan_Matrix *A );
00354
00369 Gan_Matrix *gan_mat_tpose_s ( Gan_Matrix *A );
00370
00377 Gan_Matrix *gan_mat_tpose_i ( Gan_Matrix *A );
00378
00394 Gan_Matrix *gan_mat_add_q ( Gan_Matrix *A, Gan_Matrix *B, Gan_Matrix *C );
00395
00402 Gan_Matrix *gan_mat_add_s ( Gan_Matrix *A, Gan_Matrix *B );
00403
00410 Gan_Matrix *gan_mat_add_i1 ( Gan_Matrix *A, Gan_Matrix *B );
00411
00418 Gan_Matrix *gan_mat_add_i2 ( Gan_Matrix *A, Gan_Matrix *B );
00419
00426 Gan_Matrix *gan_mat_increment ( Gan_Matrix *A, Gan_Matrix *B );
00427
00434 Gan_Matrix *gan_mat_addT_q ( Gan_Matrix *A, Gan_Matrix *B, Gan_Matrix *C );
00435
00442 Gan_Matrix *gan_mat_addT_s ( Gan_Matrix *A, Gan_Matrix *B );
00443
00450 Gan_Matrix *gan_mat_incrementT ( Gan_Matrix *A, Gan_Matrix *B );
00451
00459 Gan_SquMatrix *gan_mat_add_sym_q ( const Gan_Matrix *A, const Gan_Matrix *B,
00460 Gan_SquMatrix *C );
00461
00469 Gan_SquMatrix *gan_mat_add_sym_s ( const Gan_Matrix *A, Gan_Matrix *B );
00470
00478 Gan_SquMatrix *gan_mat_addT_sym_q ( const Gan_Matrix *A, const Gan_Matrix *B,
00479 Gan_SquMatrix *C );
00480
00488 Gan_SquMatrix *gan_mat_addT_sym_s ( const Gan_Matrix *A, const Gan_Matrix *B );
00489
00497 Gan_SquMatrix *gan_matT_add_sym_q ( const Gan_Matrix *A, const Gan_Matrix *B,
00498 Gan_SquMatrix *C );
00499
00507 Gan_SquMatrix *gan_matT_add_sym_s ( const Gan_Matrix *A, const Gan_Matrix *B );
00508
00516 Gan_SquMatrix *gan_matT_addT_sym_q ( Gan_Matrix *A, Gan_Matrix *B,
00517 Gan_SquMatrix *C );
00518
00526 Gan_SquMatrix *gan_matT_addT_sym_s ( const Gan_Matrix *A, const Gan_Matrix *B );
00527
00534 Gan_SquMatrix *gan_mat_saddT_sym_q ( const Gan_Matrix *A, const Gan_SquMatrix *B );
00535
00542 Gan_SquMatrix *gan_mat_saddT_sym_s ( const Gan_Matrix *A );
00543
00550 Gan_SquMatrix *gan_matT_sadd_sym_q ( const Gan_Matrix *A, Gan_SquMatrix *B );
00551
00558 Gan_SquMatrix *gan_matT_sadd_sym_s ( const Gan_Matrix *A );
00559
00575 Gan_Matrix *gan_mat_sub_q ( Gan_Matrix *A, Gan_Matrix *B, Gan_Matrix *C );
00576
00583 Gan_Matrix *gan_mat_sub_s ( Gan_Matrix *A, Gan_Matrix *B );
00584
00591 Gan_Matrix *gan_mat_sub_i1 ( Gan_Matrix *A, Gan_Matrix *B );
00592
00599 Gan_Matrix *gan_mat_sub_i2 ( Gan_Matrix *A, Gan_Matrix *B );
00600
00607 Gan_Matrix *gan_mat_decrement ( Gan_Matrix *A, Gan_Matrix *B );
00608
00615 Gan_Matrix *gan_mat_subT_q ( Gan_Matrix *A, Gan_Matrix *B,
00616 Gan_Matrix *C );
00617
00624 Gan_Matrix *gan_mat_subT_s ( Gan_Matrix *A, Gan_Matrix *B );
00625
00632 Gan_Matrix *gan_mat_decrementT ( Gan_Matrix *A, Gan_Matrix *B );
00633
00649 Gan_Vector *gan_mat_multv_q ( const Gan_Matrix *A, const Gan_Vector *x,
00650 Gan_Vector *y );
00651
00658 Gan_Vector *gan_mat_multv_s ( const Gan_Matrix *A, const Gan_Vector *x );
00659
00666 Gan_Vector *gan_matT_multv_q ( const Gan_Matrix *A, const Gan_Vector *x,
00667 Gan_Vector *y );
00668
00675 Gan_Vector *gan_matT_multv_s ( const Gan_Matrix *A, const Gan_Vector *x );
00676
00692 Gan_Matrix *gan_mat_rmult_q ( const Gan_Matrix *A, const Gan_Matrix *B, Gan_Matrix *C );
00693
00700 Gan_Matrix *gan_mat_rmult_s ( const Gan_Matrix *A, const Gan_Matrix *B );
00701
00708 Gan_Matrix *gan_mat_rmultT_q ( const Gan_Matrix *A, const Gan_Matrix *B,
00709 Gan_Matrix *C );
00710
00717 Gan_Matrix *gan_mat_rmultT_s ( const Gan_Matrix *A, const Gan_Matrix *B );
00718
00725 Gan_Matrix *gan_matT_rmult_q ( const Gan_Matrix *A, const Gan_Matrix *B,
00726 Gan_Matrix *C );
00727
00734 Gan_Matrix *gan_matT_rmult_s ( const Gan_Matrix *A, const Gan_Matrix *B );
00735
00742 Gan_Matrix *gan_matT_rmultT_q ( const Gan_Matrix *A, const Gan_Matrix *B,
00743 Gan_Matrix *C );
00744
00751 Gan_Matrix *gan_matT_rmultT_s ( const Gan_Matrix *A, const Gan_Matrix *B );
00752
00760 Gan_SquMatrix *gan_mat_rmult_sym_q ( const Gan_Matrix *A, const Gan_Matrix *B,
00761 Gan_SquMatrix *C );
00762
00770 Gan_SquMatrix *gan_mat_rmult_sym_s ( const Gan_Matrix *A, const Gan_Matrix *B );
00771
00779 Gan_SquMatrix *gan_mat_rmultT_sym_q ( const Gan_Matrix *A, const Gan_Matrix *B,
00780 Gan_SquMatrix *C );
00781
00789 Gan_SquMatrix *gan_mat_rmultT_sym_s ( const Gan_Matrix *A, const Gan_Matrix *B );
00790
00798 Gan_SquMatrix *gan_matT_rmult_sym_q ( const Gan_Matrix *A, const Gan_Matrix *B,
00799 Gan_SquMatrix *C );
00800
00808 Gan_SquMatrix *gan_matT_rmult_sym_s ( const Gan_Matrix *A, const Gan_Matrix *B );
00809
00817 Gan_SquMatrix *gan_matT_rmultT_sym_q ( const Gan_Matrix *A, const Gan_Matrix *B,
00818 Gan_SquMatrix *C );
00819
00827 Gan_SquMatrix *gan_matT_rmultT_sym_s ( const Gan_Matrix *A, const Gan_Matrix *B );
00828
00835 Gan_SquMatrix *gan_mat_srmultT_q ( const Gan_Matrix *A, const Gan_SquMatrix *B );
00836
00843 Gan_SquMatrix *gan_mat_srmultT_s ( const Gan_Matrix *A );
00844
00851 Gan_SquMatrix *gan_mat_slmultT_q ( const Gan_Matrix *A, Gan_SquMatrix *B );
00852
00859 Gan_SquMatrix *gan_mat_slmultT_s ( const Gan_Matrix *A );
00860
00883 Gan_Matrix *gan_mat_invert_s ( const Gan_Matrix *A );
00884
00902 Gan_Bool gan_mat_same_dims ( const Gan_Matrix *A, const Gan_Matrix *B );
00903
00922 Gan_Matrix *gan_mat_insert ( Gan_Matrix *A, unsigned long rA, unsigned long cA,
00923 const Gan_Matrix *B,
00924 unsigned long rB, unsigned long cB,
00925 unsigned long rows, unsigned long cols );
00926
00936 Gan_Matrix *gan_mat_insertT ( Gan_Matrix *A,
00937 unsigned long rA, unsigned long cA,
00938 const Gan_Matrix *B,
00939 unsigned long rB, unsigned long cB,
00940 unsigned long rows, unsigned long cols );
00941
00949 Gan_Matrix *gan_mat_insertv ( Gan_Matrix *A,
00950 unsigned long rA, unsigned long cA,
00951 const Gan_Vector *x, unsigned long rx,
00952 unsigned long rows );
00953
00964 Gan_Matrix *gan_mat_insertvT ( Gan_Matrix *A,
00965 unsigned long rA, unsigned long cA,
00966 const Gan_Vector *x, unsigned long rx,
00967 unsigned long cols );
00968
00984 Gan_Bool gan_mat_test_dims ( const Gan_Matrix *A, unsigned long rows,
00985 unsigned long cols );
00986
01002 size_t gan_mat_data_size ( unsigned long rows, unsigned long cols );
01003
01028 Gan_Matrix *gan_mat_extract_s ( const Gan_Matrix *A,
01029 unsigned long r0, unsigned long c0,
01030 unsigned long rows, unsigned long cols );
01031
01054 Gan_Matrix *gan_mat_fscanf_s ( FILE *fp, const char *prefix, int prefix_len );
01055
01066 Gan_Matrix *gan_mat_fread_s ( FILE *fp, gan_uint32 *magic_number );
01067
01072 #undef Gan_SquMatrix
01073
01074
01075 Gan_Matrix *gan_mat_form_gen ( Gan_Matrix *A,
01076 unsigned long rows, unsigned long cols,
01077 double *data, size_t data_size );
01078 Gan_Bool gan_mat_realloc_gen ( Gan_Matrix *A,
01079 unsigned long rows, unsigned long cols );
01080 Gan_Matrix *gan_mat_add_gen ( Gan_Matrix *A, Gan_TposeFlag A_tr,
01081 Gan_Matrix *B, Gan_TposeFlag B_tr,
01082 Gan_Matrix *C );
01083 struct Gan_SquMatrix *gan_mat_add_sym_gen ( const Gan_Matrix *A, Gan_TposeFlag A_tr,
01084 const Gan_Matrix *B, Gan_TposeFlag B_tr,
01085 struct Gan_SquMatrix *C );
01086 Gan_Matrix *gan_mat_sub_gen ( Gan_Matrix *A, Gan_TposeFlag A_tr,
01087 Gan_Matrix *B, Gan_TposeFlag B_tr,
01088 Gan_Matrix *C );
01089 Gan_Vector *gan_mat_multv_gen ( const Gan_Matrix *A, Gan_TposeFlag A_tr,
01090 const Gan_Vector *x, Gan_Vector *y );
01091 Gan_Matrix *gan_mat_rmult_gen ( const Gan_Matrix *A, Gan_TposeFlag A_tr,
01092 const Gan_Matrix *B, Gan_TposeFlag B_tr,
01093 Gan_Matrix *C );
01094 struct Gan_SquMatrix *gan_mat_rmult_sym_gen (const Gan_Matrix *A, Gan_TposeFlag A_tr,
01095 const Gan_Matrix *B, Gan_TposeFlag B_tr,
01096 struct Gan_SquMatrix *C );
01097 Gan_Matrix *gan_mat_insert_gen ( Gan_Matrix *A,
01098 unsigned long rA, unsigned long cA,
01099 const Gan_Matrix *B, Gan_TposeFlag B_tr,
01100 unsigned long rB, unsigned long cB,
01101 unsigned long rows , unsigned long cols );
01102 Gan_Matrix *gan_mat_insertv_gen ( Gan_Matrix *A,
01103 unsigned long rA, unsigned long cA,
01104 const struct Gan_Vector *x, Gan_TposeFlag x_tr,
01105 unsigned long rx, unsigned long size );
01106
01107 #ifndef NDEBUG
01108 void gan_mat_db ( const Gan_Matrix *A );
01109 #endif
01110
01111 #define gan_mat_realloc(A,rows,cols) gan_mat_realloc_gen(A,rows,cols)
01112
01125 #ifdef __cplusplus
01126 }
01127 #endif
01128
01129 #endif