/*************************************************************************************************************************************/ /* */ /* C O S I N U S D E S I M I L A R I T E D E D E U X F I C H I E R S N U M E R I Q U E S : */ /* */ /* */ /* Author of '$xrv/CosinusSimilarite.01$K' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20221024123710). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R F A C E ' listG ' : */ /* */ /* */ /* :Debut_listG: */ /* :Fin_listG: */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D I R E C T I V E S S P E C I F I Q U E S D E C O M P I L A T I O N : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F I C H I E R S D ' I N C L U D E S : */ /* */ /*************************************************************************************************************************************/ #include INCLUDES_BASE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* V A L E U R S I M P L I C I T E S D E S P A R A M E T R E S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U F I C H I E R : */ /* */ /*************************************************************************************************************************************/ #include xrv/ARITHMET.1d.I" #define NOMBRE_DE_DECIMALES \ SEIZE #include xrv/ARITHMET.21.I" #include xrv/champs_5.41.I" #define VALEUR_1_IMPLICITE \ FZERO #define VALEUR_2_IMPLICITE \ FZERO gGENERATION_D_UN_FICHIER(fichier1_des_valeurs,liste1_des_valeurs); gGENERATION_D_UN_FICHIER(fichier2_des_valeurs,liste2_des_valeurs); /* Definition en memoire des fichiers. */ #define ELEMENT_DU_FICHIER1(index) \ gELEMENT_DU_FICHIER(liste1_des_valeurs,index) #define ELEMENT_DU_FICHIER2(index) \ gELEMENT_DU_FICHIER(liste2_des_valeurs,index) /* Acces a un element courant des fichiers. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S E D I T I O N S : */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O S I N U S D E S I M I L A R I T E D E D E U X F I C H I E R S N U M E R I Q U E S : */ /* */ /*************************************************************************************************************************************/ BCommande(nombre_d_arguments,arguments) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock #include xrv/ARITHMET.22.I" #include xci/valeurs.03.I" /*..............................................................................................................................*/ #include xrv/champs_5.1A.I" GET_ARGUMENTS_(nombre_d_arguments ,BLOC(PROCESS_ARGUMENT_I("nombre_elements=""ne=",nombre_d_elements ,BLOC(VIDE;) ,BLOC(Bblock PRINT_AVERTISSEMENT("'ne=' doit etre defini avant toute entree de fichiers"); Eblock ) ); PROCESS_ARGUMENTS_DE_DEFINITION_DES_FICHIERS_01; PROKESF_ARGUMENT_FICHIER("fichier1=" ,fichier1_des_valeurs ,liste1_des_valeurs ,VALEUR_1_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); PROKESF_ARGUMENT_FICHIER("fichier2=" ,fichier2_des_valeurs ,liste2_des_valeurs ,VALEUR_2_IMPLICITE ,lTRANSFORMAT_0d ,iGENERATION_D_UN_FICHIER ); PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_3; PROCESS_ARGUMENTS_DE_PARAMETRAGE_DE_LA_GENERATION_DE_SUITE_DE_VALEURS_1; ) ); begin_nouveau_block Bblock DEFV(Float,INIT(somme_des_produits_fichier1_fichier2,FZERO)); DEFV(Float,INIT(somme_des_carres_de_fichier1________,FZERO)); DEFV(Float,INIT(somme_des_carres_de_fichier2________,FZERO)); DEFV(Float,INIT(cosinus_de_similarite,FLOT__UNDEF)); /* Cosinus de similarite entre les deux fichiers... */ DoIn(index ,PREMIER_ELEMENT_D_UN_FICHIER ,DERNIER_ELEMENT_D_UN_FICHIER ,I ) Bblock DEFV(Float,INIT(valeur_courante_1,ELEMENT_DU_FICHIER1(index))); DEFV(Float,INIT(valeur_courante_2,ELEMENT_DU_FICHIER2(index))); /* Recuperation des valeurs courantes dans le fichier. */ INCR(somme_des_produits_fichier1_fichier2,MUL2(valeur_courante_1,valeur_courante_2)); INCR(somme_des_carres_de_fichier1________,EXP2(valeur_courante_1)); INCR(somme_des_carres_de_fichier2________,EXP2(valeur_courante_2)); Eblock EDoI EGAL(cosinus_de_similarite ,DIVI(somme_des_produits_fichier1_fichier2 ,MUL2(RACX(somme_des_carres_de_fichier1________) ,RACX(somme_des_carres_de_fichier2________) ) ) ); /* Tout ceci repose sur la definition "standard" du produit scalaire entre deux vecteurs */ /* V1 et V2 : */ /* */ /* ---> ---> ---> ---> */ /* V1 . V2 = | V1 |.| V2 |.cos(teta) */ /* */ /* et donc, ci-dessus on assimile 'fichier1' et 'fichier2' a deux vecteurs V1 et V2... */ /* */ /* On notera que l'on n'optimise pas suivant : */ /* */ /* RACX(MUL2(somme_des_carres_de_fichier1________ */ /* ,somme_des_carres_de_fichier2________ */ /* ) */ /* ) */ /* */ /* afin que cela ressemble a la definition du produit scalaire ci-dessus... */ EDITION_DANS_gOPERATION_SUR_LES_FICHIERS_AVEC_SAUT_DE_LIGNE(cosinus_de_similarite); /* On notera le cas particulier ou les deux fichiers sont identiques : */ /* */ /* cosinus_de_similarite = +1 */ /* */ /* et s'ils sont tres differents : */ /* */ /* cosinus_de_similarite = -1 */ /* */ Eblock end_nouveau_block lGENERATION_D_UN_FICHIER(liste2_des_valeurs,VALEUR_2_IMPLICITE); lGENERATION_D_UN_FICHIER(liste1_des_valeurs,VALEUR_1_IMPLICITE); RETU_Commande; Eblock ECommande