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 ( Gan_Matrix *A,
00096 unsigned long rows, unsigned long cols, ... );
00097 Gan_Matrix *gan_mat_copy_q ( 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 struct Gan_SquMatrix *B,
00104 unsigned long rB, unsigned long cB,
00105 unsigned long rows , unsigned long cols );
00106 void gan_mat_free_va ( Gan_Matrix *A, ... );
00107 Gan_Matrix *gan_mat_extract_q ( Gan_Matrix *A,
00108 unsigned long r0, unsigned long c0,
00109 unsigned long rows, unsigned long cols,
00110 Gan_Matrix *B );
00111 double gan_mat_sumsqr ( Gan_Matrix *A );
00112 double gan_mat_Fnorm ( Gan_Matrix *A );
00113 Gan_Matrix *gan_mat_invert_q ( Gan_Matrix *A, Gan_Matrix *B );
00114 Gan_Bool gan_mat_fprint ( FILE *fp, Gan_Matrix *A, const char *prefix,
00115 unsigned indent, const char *fmt );
00116 Gan_Matrix *gan_mat_fscanf_q ( FILE *fp, Gan_Matrix *A,
00117 char *prefix, int prefix_len );
00118 Gan_Bool gan_mat_fwrite ( FILE *fp, Gan_Matrix *A, gan_ui32 magic_number );
00119 Gan_Matrix *gan_mat_fread_q ( FILE *fp, Gan_Matrix *A,
00120 gan_ui32 *magic_number );
00121
00122 #define Gan_SquMatrix struct Gan_SquMatrix
00123
00137 Gan_Matrix *gan_mat_alloc ( unsigned long rows, unsigned long cols );
00138
00150 Gan_Matrix *gan_mat_form ( Gan_Matrix *A,
00151 unsigned long rows, unsigned long cols );
00152
00167 Gan_Matrix *gan_mat_form_data ( Gan_Matrix *A,
00168 unsigned long rows, unsigned long cols,
00169 void *data, size_t data_size );
00170
00186 Gan_Bool gan_mat_set_el ( Gan_Matrix *A, unsigned i, unsigned j, double value);
00187
00193 double gan_mat_get_el ( Gan_Matrix *A, unsigned i, unsigned j );
00194
00201 Gan_Bool gan_mat_inc_el ( Gan_Matrix *A, unsigned i, unsigned j, double value);
00202
00209 Gan_Bool gan_mat_dec_el ( Gan_Matrix *A, unsigned i, unsigned j, double value);
00210
00227 Gan_Bool gan_mat_print ( Gan_Matrix *A,
00228 const char *prefix, int indent, const char *fmt );
00229
00251 Gan_Matrix *gan_mat_fill_const_s ( unsigned long rows, unsigned long cols,
00252 double value );
00253
00264 Gan_Matrix *gan_mat_fill_zero_q ( Gan_Matrix *A,
00265 unsigned long rows, unsigned long cols );
00266
00278 Gan_Matrix *gan_mat_fill_zero_s ( unsigned long rows, unsigned cols );
00279
00294 Gan_Matrix *gan_mat_copy_s ( Gan_Matrix *A );
00295
00310 Gan_Matrix *gan_mat_scale_s ( Gan_Matrix *A, double a );
00311
00317 Gan_Matrix *gan_mat_scale_i ( Gan_Matrix *A, double a );
00318
00324 Gan_Matrix *gan_mat_divide_s ( Gan_Matrix *A, double a );
00325
00331 Gan_Matrix *gan_mat_divide_i ( Gan_Matrix *A, double a );
00332
00338 Gan_Matrix *gan_mat_negate_q ( Gan_Matrix *A, Gan_Matrix *B );
00339
00345 Gan_Matrix *gan_mat_negate_s ( Gan_Matrix *A );
00346
00352 Gan_Matrix *gan_mat_negate_i ( Gan_Matrix *A );
00353
00368 Gan_Matrix *gan_mat_tpose_s ( Gan_Matrix *A );
00369
00376 Gan_Matrix *gan_mat_tpose_i ( Gan_Matrix *A );
00377
00393 Gan_Matrix *gan_mat_add_q ( Gan_Matrix *A, Gan_Matrix *B, Gan_Matrix *C );
00394
00401 Gan_Matrix *gan_mat_add_s ( Gan_Matrix *A, Gan_Matrix *B );
00402
00409 Gan_Matrix *gan_mat_add_i1 ( Gan_Matrix *A, Gan_Matrix *B );
00410
00417 Gan_Matrix *gan_mat_add_i2 ( Gan_Matrix *A, Gan_Matrix *B );
00418
00425 Gan_Matrix *gan_mat_increment ( Gan_Matrix *A, Gan_Matrix *B );
00426
00433 Gan_Matrix *gan_mat_addT_q ( Gan_Matrix *A, Gan_Matrix *B, Gan_Matrix *C );
00434
00441 Gan_Matrix *gan_mat_addT_s ( Gan_Matrix *A, Gan_Matrix *B );
00442
00449 Gan_Matrix *gan_mat_incrementT ( Gan_Matrix *A, Gan_Matrix *B );
00450
00458 Gan_SquMatrix *gan_mat_add_sym_q ( Gan_Matrix *A, Gan_Matrix *B,
00459 Gan_SquMatrix *C );
00460
00468 Gan_SquMatrix *gan_mat_add_sym_s ( Gan_Matrix *A, Gan_Matrix *B );
00469
00477 Gan_SquMatrix *gan_mat_addT_sym_q ( Gan_Matrix *A, Gan_Matrix *B,
00478 Gan_SquMatrix *C );
00479
00487 Gan_SquMatrix *gan_mat_addT_sym_s ( Gan_Matrix *A, Gan_Matrix *B );
00488
00496 Gan_SquMatrix *gan_matT_add_sym_q ( Gan_Matrix *A, Gan_Matrix *B,
00497 Gan_SquMatrix *C );
00498
00506 Gan_SquMatrix *gan_matT_add_sym_s ( Gan_Matrix *A, Gan_Matrix *B );
00507
00515 Gan_SquMatrix *gan_matT_addT_sym_q ( Gan_Matrix *A, Gan_Matrix *B,
00516 Gan_SquMatrix *C );
00517
00525 Gan_SquMatrix *gan_matT_addT_sym_s ( Gan_Matrix *A, Gan_Matrix *B );
00526
00533 Gan_SquMatrix *gan_mat_saddT_sym_q ( Gan_Matrix *A, Gan_SquMatrix *B );
00534
00541 Gan_SquMatrix *gan_mat_saddT_sym_s ( Gan_Matrix *A );
00542
00549 Gan_SquMatrix *gan_matT_sadd_sym_q ( Gan_Matrix *A, Gan_SquMatrix *B );
00550
00557 Gan_SquMatrix *gan_matT_sadd_sym_s ( Gan_Matrix *A );
00558
00574 Gan_Matrix *gan_mat_sub_q ( Gan_Matrix *A, Gan_Matrix *B, Gan_Matrix *C );
00575
00582 Gan_Matrix *gan_mat_sub_s ( Gan_Matrix *A, Gan_Matrix *B );
00583
00590 Gan_Matrix *gan_mat_sub_i1 ( Gan_Matrix *A, Gan_Matrix *B );
00591
00598 Gan_Matrix *gan_mat_sub_i2 ( Gan_Matrix *A, Gan_Matrix *B );
00599
00606 Gan_Matrix *gan_mat_decrement ( Gan_Matrix *A, Gan_Matrix *B );
00607
00614 Gan_Matrix *gan_mat_subT_q ( Gan_Matrix *A, Gan_Matrix *B,
00615 Gan_Matrix *C );
00616
00623 Gan_Matrix *gan_mat_subT_s ( Gan_Matrix *A, Gan_Matrix *B );
00624
00631 Gan_Matrix *gan_mat_decrementT ( Gan_Matrix *A, Gan_Matrix *B );
00632
00648 Gan_Vector *gan_mat_multv_q ( Gan_Matrix *A, Gan_Vector *x,
00649 Gan_Vector *y );
00650
00657 Gan_Vector *gan_mat_multv_s ( Gan_Matrix *A, Gan_Vector *x );
00658
00665 Gan_Vector *gan_matT_multv_q ( Gan_Matrix *A, Gan_Vector *x,
00666 Gan_Vector *y );
00667
00674 Gan_Vector *gan_matT_multv_s ( Gan_Matrix *A, Gan_Vector *x );
00675
00691 Gan_Matrix *gan_mat_rmult_q ( Gan_Matrix *A, Gan_Matrix *B, Gan_Matrix *C );
00692
00699 Gan_Matrix *gan_mat_rmult_s ( Gan_Matrix *A, Gan_Matrix *B );
00700
00707 Gan_Matrix *gan_mat_rmultT_q ( Gan_Matrix *A, Gan_Matrix *B,
00708 Gan_Matrix *C );
00709
00716 Gan_Matrix *gan_mat_rmultT_s ( Gan_Matrix *A, Gan_Matrix *B );
00717
00724 Gan_Matrix *gan_matT_rmult_q ( Gan_Matrix *A, Gan_Matrix *B,
00725 Gan_Matrix *C );
00726
00733 Gan_Matrix *gan_matT_rmult_s ( Gan_Matrix *A, Gan_Matrix *B );
00734
00741 Gan_Matrix *gan_matT_rmultT_q ( Gan_Matrix *A, Gan_Matrix *B,
00742 Gan_Matrix *C );
00743
00750 Gan_Matrix *gan_matT_rmultT_s ( Gan_Matrix *A, Gan_Matrix *B );
00751
00759 Gan_SquMatrix *gan_mat_rmult_sym_q ( Gan_Matrix *A, Gan_Matrix *B,
00760 Gan_SquMatrix *C );
00761
00769 Gan_SquMatrix *gan_mat_rmult_sym_s ( Gan_Matrix *A, Gan_Matrix *B );
00770
00778 Gan_SquMatrix *gan_mat_rmultT_sym_q ( Gan_Matrix *A, Gan_Matrix *B,
00779 Gan_SquMatrix *C );
00780
00788 Gan_SquMatrix *gan_mat_rmultT_sym_s ( Gan_Matrix *A, Gan_Matrix *B );
00789
00797 Gan_SquMatrix *gan_matT_rmult_sym_q ( Gan_Matrix *A, Gan_Matrix *B,
00798 Gan_SquMatrix *C );
00799
00807 Gan_SquMatrix *gan_matT_rmult_sym_s ( Gan_Matrix *A, Gan_Matrix *B );
00808
00816 Gan_SquMatrix *gan_matT_rmultT_sym_q ( Gan_Matrix *A, Gan_Matrix *B,
00817 Gan_SquMatrix *C );
00818
00826 Gan_SquMatrix *gan_matT_rmultT_sym_s ( Gan_Matrix *A, Gan_Matrix *B );
00827
00834 Gan_SquMatrix *gan_mat_srmultT_q ( Gan_Matrix *A, Gan_SquMatrix *B );
00835
00842 Gan_SquMatrix *gan_mat_srmultT_s ( Gan_Matrix *A );
00843
00850 Gan_SquMatrix *gan_mat_slmultT_q ( Gan_Matrix *A, Gan_SquMatrix *B );
00851
00858 Gan_SquMatrix *gan_mat_slmultT_s ( Gan_Matrix *A );
00859
00882 Gan_Matrix *gan_mat_invert_s ( Gan_Matrix *A );
00883
00901 Gan_Bool gan_mat_same_dims ( Gan_Matrix *A, Gan_Matrix *B );
00902
00921 Gan_Matrix *gan_mat_insert ( Gan_Matrix *A, unsigned long rA, unsigned long cA,
00922 Gan_Matrix *B,
00923 unsigned long rB, unsigned long cB,
00924 unsigned long rows, unsigned long cols );
00925
00935 Gan_Matrix *gan_mat_insertT ( Gan_Matrix *A,
00936 unsigned long rA, unsigned long cA,
00937 Gan_Matrix *B,
00938 unsigned long rB, unsigned long cB,
00939 unsigned long rows, unsigned long cols );
00940
00948 Gan_Matrix *gan_mat_insertv ( Gan_Matrix *A,
00949 unsigned long rA, unsigned long cA,
00950 Gan_Vector *x, unsigned long rx,
00951 unsigned long rows );
00952
00963 Gan_Matrix *gan_mat_insertvT ( Gan_Matrix *A,
00964 unsigned long rA, unsigned long cA,
00965 Gan_Vector *x, unsigned long rx,
00966 unsigned long cols );
00967
00983 Gan_Bool gan_mat_test_dims ( Gan_Matrix *A, unsigned long rows,
00984 unsigned long cols );
00985
01001 size_t gan_mat_data_size ( unsigned long rows, unsigned long cols );
01002
01027 Gan_Matrix *gan_mat_extract_s ( Gan_Matrix *A,
01028 unsigned long r0, unsigned long c0,
01029 unsigned long rows, unsigned long cols );
01030
01053 Gan_Matrix *gan_mat_fscanf_s ( FILE *fp, const char *prefix, int prefix_len );
01054
01065 Gan_Matrix *gan_mat_fread_s ( FILE *fp, gan_ui32 *magic_number );
01066
01071 #undef Gan_SquMatrix
01072
01073
01074 Gan_Matrix *gan_mat_form_gen ( Gan_Matrix *A,
01075 unsigned long rows, unsigned long cols,
01076 double *data, size_t data_size );
01077 Gan_Bool gan_mat_realloc_gen ( Gan_Matrix *A,
01078 unsigned long rows, unsigned long cols );
01079 Gan_Matrix *gan_mat_add_gen ( Gan_Matrix *A, Gan_TposeFlag A_tr,
01080 Gan_Matrix *B, Gan_TposeFlag B_tr,
01081 Gan_Matrix *C );
01082 struct Gan_SquMatrix *gan_mat_add_sym_gen ( Gan_Matrix *A, Gan_TposeFlag A_tr,
01083 Gan_Matrix *B, Gan_TposeFlag B_tr,
01084 struct Gan_SquMatrix *C );
01085 Gan_Matrix *gan_mat_sub_gen ( Gan_Matrix *A, Gan_TposeFlag A_tr,
01086 Gan_Matrix *B, Gan_TposeFlag B_tr,
01087 Gan_Matrix *C );
01088 Gan_Vector *gan_mat_multv_gen ( Gan_Matrix *A, Gan_TposeFlag A_tr,
01089 Gan_Vector *x, Gan_Vector *y );
01090 Gan_Matrix *gan_mat_rmult_gen ( Gan_Matrix *A, Gan_TposeFlag A_tr,
01091 Gan_Matrix *B, Gan_TposeFlag B_tr,
01092 Gan_Matrix *C );
01093 struct Gan_SquMatrix *gan_mat_rmult_sym_gen (Gan_Matrix *A, Gan_TposeFlag A_tr,
01094 Gan_Matrix *B, Gan_TposeFlag B_tr,
01095 struct Gan_SquMatrix *C );
01096 Gan_Matrix *gan_mat_insert_gen ( Gan_Matrix *A,
01097 unsigned long rA, unsigned long cA,
01098 Gan_Matrix *B, Gan_TposeFlag B_tr,
01099 unsigned long rB, unsigned long cB,
01100 unsigned long rows , unsigned long cols );
01101 Gan_Matrix *gan_mat_insertv_gen ( Gan_Matrix *A,
01102 unsigned long rA, unsigned long cA,
01103 struct Gan_Vector *x, Gan_TposeFlag x_tr,
01104 unsigned long rx, unsigned long size );
01105
01106 #ifndef NDEBUG
01107 void gan_mat_db ( Gan_Matrix *A );
01108 #endif
01109
01110 #define gan_mat_realloc(A,rows,cols) gan_mat_realloc_gen(A,rows,cols)
01111
01124 #ifdef __cplusplus
01125 }
01126 #endif
01127
01128 #endif