00001
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef _GAN_MATF_GEN_H
00030 #define _GAN_MATF_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_f;
00059
00061 typedef struct Gan_Matrix_f
00062 {
00063
00064 unsigned long rows, cols;
00065
00066
00067 float *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_f;
00078
00079 #define GAN_MATRIXF_STRUCT_DEFINED
00080
00081 #include <gandalf/linalg/vecf_gen.h>
00082 #include <gandalf/linalg/matf_square.h>
00083
00084 void gan_matf_free ( Gan_Matrix_f *A );
00085 Gan_Matrix_f *gan_matf_set_dims ( Gan_Matrix_f *A,
00086 unsigned long rows, unsigned long cols );
00087 Gan_Matrix_f *gan_matf_fill_va ( Gan_Matrix_f *A,
00088 unsigned long rows, unsigned long cols, ... );
00089 Gan_Matrix_f *gan_matf_fill_vap ( Gan_Matrix_f *A,
00090 unsigned long rows, unsigned long cols,
00091 va_list *aptr );
00092 Gan_Matrix_f *gan_matf_fill_const_q ( Gan_Matrix_f *A,
00093 unsigned long rows, unsigned long cols,
00094 float value );
00095 Gan_Bool gan_matf_read_va ( Gan_Matrix_f *A,
00096 unsigned long rows, unsigned long cols, ... );
00097 Gan_Matrix_f *gan_matf_copy_q ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00098 Gan_Matrix_f *gan_matf_scale_q ( Gan_Matrix_f *A, float a, Gan_Matrix_f *B );
00099 Gan_Matrix_f *gan_matf_divide_q ( Gan_Matrix_f *A, float a, Gan_Matrix_f *B );
00100 Gan_Matrix_f *gan_matf_tpose_q ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00101 Gan_Matrix_f *gan_matf_insertsym ( Gan_Matrix_f *A,
00102 unsigned long rA, unsigned long cA,
00103 struct Gan_SquMatrix_f *B,
00104 unsigned long rB, unsigned long cB,
00105 unsigned long rows , unsigned long cols );
00106 void gan_matf_free_va ( Gan_Matrix_f *A, ... );
00107 Gan_Matrix_f *gan_matf_extract_q ( Gan_Matrix_f *A,
00108 unsigned long r0, unsigned long c0,
00109 unsigned long rows, unsigned long cols,
00110 Gan_Matrix_f *B );
00111 float gan_matf_sumsqr ( Gan_Matrix_f *A );
00112 float gan_matf_Fnorm ( Gan_Matrix_f *A );
00113 Gan_Matrix_f *gan_matf_invert_q ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00114 Gan_Bool gan_matf_fprint ( FILE *fp, Gan_Matrix_f *A, const char *prefix,
00115 unsigned indent, const char *fmt );
00116 Gan_Matrix_f *gan_matf_fscanf_q ( FILE *fp, Gan_Matrix_f *A,
00117 char *prefix, int prefix_len );
00118 Gan_Bool gan_matf_fwrite ( FILE *fp, Gan_Matrix_f *A, gan_ui32 magic_number );
00119 Gan_Matrix_f *gan_matf_fread_q ( FILE *fp, Gan_Matrix_f *A,
00120 gan_ui32 *magic_number );
00121
00122 #define Gan_SquMatrix_f struct Gan_SquMatrix_f
00123
00137 Gan_Matrix_f *gan_matf_alloc ( unsigned long rows, unsigned long cols );
00138
00150 Gan_Matrix_f *gan_matf_form ( Gan_Matrix_f *A,
00151 unsigned long rows, unsigned long cols );
00152
00167 Gan_Matrix_f *gan_matf_form_data ( Gan_Matrix_f *A,
00168 unsigned long rows, unsigned long cols,
00169 void *data, size_t data_size );
00170
00186 Gan_Bool gan_matf_set_el ( Gan_Matrix_f *A,
00187 unsigned i, unsigned j, float value);
00188
00194 float gan_matf_get_el ( Gan_Matrix_f *A, unsigned i, unsigned j );
00195
00202 Gan_Bool gan_matf_inc_el ( Gan_Matrix_f *A,
00203 unsigned i, unsigned j, float value);
00204
00211 Gan_Bool gan_matf_dec_el ( Gan_Matrix_f *A,
00212 unsigned i, unsigned j, float value);
00213
00230 Gan_Bool gan_matf_print ( Gan_Matrix_f *A,
00231 const char *prefix, int indent, const char *fmt );
00232
00254 Gan_Matrix_f *gan_matf_fill_const_s ( unsigned long rows, unsigned long cols,
00255 float value );
00256
00267 Gan_Matrix_f *gan_matf_fill_zero_q ( Gan_Matrix_f *A,
00268 unsigned long rows, unsigned long cols );
00269
00281 Gan_Matrix_f *gan_matf_fill_zero_s ( unsigned long rows, unsigned cols );
00282
00297 Gan_Matrix_f *gan_matf_copy_s ( Gan_Matrix_f *A );
00298
00313 Gan_Matrix_f *gan_matf_scale_s ( Gan_Matrix_f *A, float a );
00314
00320 Gan_Matrix_f *gan_matf_scale_i ( Gan_Matrix_f *A, float a );
00321
00327 Gan_Matrix_f *gan_matf_divide_s ( Gan_Matrix_f *A, float a );
00328
00334 Gan_Matrix_f *gan_matf_divide_i ( Gan_Matrix_f *A, float a );
00335
00341 Gan_Matrix_f *gan_matf_negate_q ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00342
00348 Gan_Matrix_f *gan_matf_negate_s ( Gan_Matrix_f *A );
00349
00355 Gan_Matrix_f *gan_matf_negate_i ( Gan_Matrix_f *A );
00356
00371 Gan_Matrix_f *gan_matf_tpose_s ( Gan_Matrix_f *A );
00372
00379 Gan_Matrix_f *gan_matf_tpose_i ( Gan_Matrix_f *A );
00380
00396 Gan_Matrix_f *gan_matf_add_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00397 Gan_Matrix_f *C );
00398
00405 Gan_Matrix_f *gan_matf_add_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00406
00413 Gan_Matrix_f *gan_matf_add_i1 ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00414
00421 Gan_Matrix_f *gan_matf_add_i2 ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00422
00429 Gan_Matrix_f *gan_matf_increment ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00430
00437 Gan_Matrix_f *gan_matf_addT_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00438 Gan_Matrix_f *C );
00439
00446 Gan_Matrix_f *gan_matf_addT_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00447
00454 Gan_Matrix_f *gan_matf_incrementT ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00455
00463 Gan_SquMatrix_f *gan_matf_add_sym_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00464 Gan_SquMatrix_f *C );
00465
00473 Gan_SquMatrix_f *gan_matf_add_sym_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00474
00482 Gan_SquMatrix_f *gan_matf_addT_sym_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00483 Gan_SquMatrix_f *C );
00484
00492 Gan_SquMatrix_f *gan_matf_addT_sym_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00493
00501 Gan_SquMatrix_f *gan_matTf_add_sym_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00502 Gan_SquMatrix_f *C );
00503
00511 Gan_SquMatrix_f *gan_matTf_add_sym_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00512
00520 Gan_SquMatrix_f *gan_matTf_addT_sym_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00521 Gan_SquMatrix_f *C );
00522
00530 Gan_SquMatrix_f *gan_matTf_addT_sym_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00531
00538 Gan_SquMatrix_f *gan_matf_saddT_sym_q ( Gan_Matrix_f *A, Gan_SquMatrix_f *B );
00539
00546 Gan_SquMatrix_f *gan_matf_saddT_sym_s ( Gan_Matrix_f *A );
00547
00554 Gan_SquMatrix_f *gan_matTf_sadd_sym_q ( Gan_Matrix_f *A, Gan_SquMatrix_f *B );
00555
00562 Gan_SquMatrix_f *gan_matTf_sadd_sym_s ( Gan_Matrix_f *A );
00563
00579 Gan_Matrix_f *gan_matf_sub_q ( Gan_Matrix_f *A, Gan_Matrix_f *B, Gan_Matrix_f *C );
00580
00587 Gan_Matrix_f *gan_matf_sub_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00588
00595 Gan_Matrix_f *gan_matf_sub_i1 ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00596
00603 Gan_Matrix_f *gan_matf_sub_i2 ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00604
00611 Gan_Matrix_f *gan_matf_decrement ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00612
00619 Gan_Matrix_f *gan_matf_subT_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00620 Gan_Matrix_f *C );
00621
00628 Gan_Matrix_f *gan_matf_subT_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00629
00636 Gan_Matrix_f *gan_matf_decrementT ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00637
00653 Gan_Vector_f *gan_matf_multv_q ( Gan_Matrix_f *A, Gan_Vector_f *x,
00654 Gan_Vector_f *y );
00655
00662 Gan_Vector_f *gan_matf_multv_s ( Gan_Matrix_f *A, Gan_Vector_f *x );
00663
00670 Gan_Vector_f *gan_matTf_multv_q ( Gan_Matrix_f *A, Gan_Vector_f *x,
00671 Gan_Vector_f *y );
00672
00679 Gan_Vector_f *gan_matTf_multv_s ( Gan_Matrix_f *A, Gan_Vector_f *x );
00680
00696 Gan_Matrix_f *gan_matf_rmult_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00697 Gan_Matrix_f *C );
00698
00705 Gan_Matrix_f *gan_matf_rmult_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00706
00713 Gan_Matrix_f *gan_matf_rmultT_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00714 Gan_Matrix_f *C );
00715
00722 Gan_Matrix_f *gan_matf_rmultT_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00723
00730 Gan_Matrix_f *gan_matTf_rmult_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00731 Gan_Matrix_f *C );
00732
00739 Gan_Matrix_f *gan_matTf_rmult_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00740
00747 Gan_Matrix_f *gan_matTf_rmultT_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00748 Gan_Matrix_f *C );
00749
00756 Gan_Matrix_f *gan_matTf_rmultT_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00757
00765 Gan_SquMatrix_f *gan_matf_rmult_sym_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00766 Gan_SquMatrix_f *C );
00767
00775 Gan_SquMatrix_f *gan_matf_rmult_sym_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00776
00784 Gan_SquMatrix_f *gan_matf_rmultT_sym_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00785 Gan_SquMatrix_f *C );
00786
00794 Gan_SquMatrix_f *gan_matf_rmultT_sym_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00795
00803 Gan_SquMatrix_f *gan_matTf_rmult_sym_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00804 Gan_SquMatrix_f *C );
00805
00813 Gan_SquMatrix_f *gan_matTf_rmult_sym_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00814
00822 Gan_SquMatrix_f *gan_matTf_rmultT_sym_q ( Gan_Matrix_f *A, Gan_Matrix_f *B,
00823 Gan_SquMatrix_f *C );
00824
00832 Gan_SquMatrix_f *gan_matTf_rmultT_sym_s ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00833
00840 Gan_SquMatrix_f *gan_matf_srmultT_q ( Gan_Matrix_f *A, Gan_SquMatrix_f *B );
00841
00848 Gan_SquMatrix_f *gan_matf_srmultT_s ( Gan_Matrix_f *A );
00849
00856 Gan_SquMatrix_f *gan_matf_slmultT_q ( Gan_Matrix_f *A, Gan_SquMatrix_f *B );
00857
00864 Gan_SquMatrix_f *gan_matf_slmultT_s ( Gan_Matrix_f *A );
00865
00888 Gan_Matrix_f *gan_matf_invert_s ( Gan_Matrix_f *A ) ;
00889
00907 Gan_Bool gan_matf_same_dims ( Gan_Matrix_f *A, Gan_Matrix_f *B );
00908
00927 Gan_Matrix_f *gan_matf_insert ( Gan_Matrix_f *A,
00928 unsigned long rA, unsigned long cA,
00929 Gan_Matrix_f *B,
00930 unsigned long rB, unsigned long cB,
00931 unsigned long rows, unsigned long cols )
00932 ;
00933
00943 Gan_Matrix_f *gan_matf_insertT ( Gan_Matrix_f *A,
00944 unsigned long rA, unsigned long cA,
00945 Gan_Matrix_f *B,
00946 unsigned long rB, unsigned long cB,
00947 unsigned long rows, unsigned long cols );
00948
00956 Gan_Matrix_f *gan_matf_insertv ( Gan_Matrix_f *A,
00957 unsigned long rA, unsigned long cA,
00958 Gan_Vector_f *x, unsigned long rx,
00959 unsigned long rows );
00960
00971 Gan_Matrix_f *gan_matf_insertvT ( Gan_Matrix_f *A,
00972 unsigned long rA, unsigned long cA,
00973 Gan_Vector_f *x, unsigned long rx,
00974 unsigned long cols );
00975
00991 Gan_Bool gan_matf_test_dims ( Gan_Matrix_f *A, unsigned long rows,
00992 unsigned long cols );
00993
01009 size_t gan_matf_data_size ( unsigned long rows, unsigned long cols );
01010
01035 Gan_Matrix_f *gan_matf_extract_s ( Gan_Matrix_f *A,
01036 unsigned long r0, unsigned long c0,
01037 unsigned long rows, unsigned long cols );
01038
01061 Gan_Matrix_f *gan_matf_fscanf_s ( FILE *fp, const char *prefix,
01062 int prefix_len );
01063
01074 Gan_Matrix_f *gan_matf_fread_s ( FILE *fp, gan_ui32 *magic_number );
01075
01080 #undef Gan_SquMatrix_f
01081
01082
01083 Gan_Matrix_f *gan_matf_form_gen ( Gan_Matrix_f *A,
01084 unsigned long rows, unsigned long cols,
01085 float *data, size_t data_size );
01086 Gan_Bool gan_matf_realloc_gen ( Gan_Matrix_f *A,
01087 unsigned long rows, unsigned long cols );
01088 Gan_Matrix_f *gan_matf_add_gen ( Gan_Matrix_f *A, Gan_TposeFlag A_tr,
01089 Gan_Matrix_f *B, Gan_TposeFlag B_tr,
01090 Gan_Matrix_f *C );
01091 struct Gan_SquMatrix_f *gan_matf_add_sym_gen (
01092 Gan_Matrix_f *A, Gan_TposeFlag A_tr,
01093 Gan_Matrix_f *B, Gan_TposeFlag B_tr,
01094 struct Gan_SquMatrix_f *C );
01095 Gan_Matrix_f *gan_matf_sub_gen ( Gan_Matrix_f *A, Gan_TposeFlag A_tr,
01096 Gan_Matrix_f *B, Gan_TposeFlag B_tr,
01097 Gan_Matrix_f *C );
01098 Gan_Vector_f *gan_matf_multv_gen ( Gan_Matrix_f *A, Gan_TposeFlag A_tr,
01099 Gan_Vector_f *x, Gan_Vector_f *y );
01100 Gan_Matrix_f *gan_matf_rmult_gen ( Gan_Matrix_f *A, Gan_TposeFlag A_tr,
01101 Gan_Matrix_f *B, Gan_TposeFlag B_tr,
01102 Gan_Matrix_f *C );
01103 struct Gan_SquMatrix_f *gan_matf_rmult_sym_gen (
01104 Gan_Matrix_f *A, Gan_TposeFlag A_tr,
01105 Gan_Matrix_f *B, Gan_TposeFlag B_tr,
01106 struct Gan_SquMatrix_f *C );
01107 Gan_Matrix_f *gan_matf_insert_gen ( Gan_Matrix_f *A,
01108 unsigned long rA, unsigned long cA,
01109 Gan_Matrix_f *B, Gan_TposeFlag B_tr,
01110 unsigned long rB, unsigned long cB,
01111 unsigned long rows , unsigned long cols );
01112 Gan_Matrix_f *gan_matf_insertv_gen ( Gan_Matrix_f *A,
01113 unsigned long rA, unsigned long cA,
01114 struct Gan_Vector_f *x,
01115 Gan_TposeFlag x_tr,
01116 unsigned long rx, unsigned long size );
01117
01118 #ifndef NDEBUG
01119 void gan_matf_db ( Gan_Matrix_f *A );
01120 #endif
01121
01122 #define gan_matf_realloc(A,rows,cols) gan_matf_realloc_gen(A,rows,cols)
01123
01124 #ifdef __cplusplus
01125 }
01126 #endif
01127
01128 #endif