@@ -852,6 +852,167 @@ static ERL_NIF_TERM load_csv_as_matrix(ErlNifEnv *env, int argc, const ERL_NIF_T
852
852
return mat_ret ;
853
853
}
854
854
855
+ static ERL_NIF_TERM add_scalar_to_matrix (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
856
+ {
857
+ ERL_NIF_TERM ret ;
858
+ unsigned i , j ;
859
+ mx_t mx , mx_ret ;
860
+ mx .p = NULL ;
861
+ mx_ret .p = NULL ;
862
+
863
+ if (!enif_get_resource (env , argv [0 ], resource_type , & mx .vp )) {
864
+ return enif_make_badarg (env );
865
+ }
866
+
867
+ double scalar = 0.0 ;
868
+ if (!enif_get_double (env , argv [1 ], & scalar )) {
869
+ return enif_make_badarg (env );
870
+ }
871
+
872
+ mx_ret .p = alloc_matrix (env , mx .p -> nrows , mx .p -> ncols );
873
+ for (i = 0 ; i < mx .p -> nrows ; i ++ ) {
874
+ for (j = 0 ; j < mx .p -> ncols ; j ++ ) {
875
+ POS (mx_ret .p , i , j ) = POS (mx .p , i , j ) + scalar ;
876
+ }
877
+ }
878
+
879
+ ret = enif_make_resource (env , mx_ret .p );
880
+ enif_release_resource (mx_ret .p );
881
+ return ret ;
882
+ }
883
+
884
+ static ERL_NIF_TERM subtract_scalar_from_matrix (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
885
+ {
886
+ ERL_NIF_TERM ret ;
887
+ unsigned i , j ;
888
+ mx_t mx , mx_ret ;
889
+ mx .p = NULL ;
890
+ mx_ret .p = NULL ;
891
+
892
+ if (!enif_get_resource (env , argv [0 ], resource_type , & mx .vp )) {
893
+ return enif_make_badarg (env );
894
+ }
895
+
896
+ double scalar = 0.0 ;
897
+ if (!enif_get_double (env , argv [1 ], & scalar )) {
898
+ return enif_make_badarg (env );
899
+ }
900
+
901
+ mx_ret .p = alloc_matrix (env , mx .p -> nrows , mx .p -> ncols );
902
+ for (i = 0 ; i < mx .p -> nrows ; i ++ ) {
903
+ for (j = 0 ; j < mx .p -> ncols ; j ++ ) {
904
+ POS (mx_ret .p , i , j ) = POS (mx .p , i , j ) - scalar ;
905
+ }
906
+ }
907
+
908
+ ret = enif_make_resource (env , mx_ret .p );
909
+ enif_release_resource (mx_ret .p );
910
+ return ret ;
911
+ }
912
+
913
+ static ERL_NIF_TERM multiply_matrix_with_scalar (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
914
+ {
915
+ ERL_NIF_TERM ret ;
916
+ unsigned i , j ;
917
+ mx_t mx , mx_ret ;
918
+ mx .p = NULL ;
919
+ mx_ret .p = NULL ;
920
+
921
+ if (!enif_get_resource (env , argv [0 ], resource_type , & mx .vp )) {
922
+ return enif_make_badarg (env );
923
+ }
924
+
925
+ double scalar = 1.0 ;
926
+ if (!enif_get_double (env , argv [1 ], & scalar )) {
927
+ return enif_make_badarg (env );
928
+ }
929
+
930
+ mx_ret .p = alloc_matrix (env , mx .p -> nrows , mx .p -> ncols );
931
+ for (i = 0 ; i < mx .p -> nrows ; i ++ ) {
932
+ for (j = 0 ; j < mx .p -> ncols ; j ++ ) {
933
+ POS (mx_ret .p , i , j ) = POS (mx .p , i , j ) * scalar ;
934
+ }
935
+ }
936
+
937
+ ret = enif_make_resource (env , mx_ret .p );
938
+ enif_release_resource (mx_ret .p );
939
+ return ret ;
940
+ }
941
+
942
+ static ERL_NIF_TERM divide_matrix_by_scalar (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
943
+ {
944
+ ERL_NIF_TERM ret ;
945
+ unsigned i , j ;
946
+ mx_t mx , mx_ret ;
947
+ mx .p = NULL ;
948
+ mx_ret .p = NULL ;
949
+
950
+ if (!enif_get_resource (env , argv [0 ], resource_type , & mx .vp )) {
951
+ return enif_make_badarg (env );
952
+ }
953
+
954
+ double scalar = 1.0 ;;
955
+ if ((!enif_get_double (env , argv [1 ], & scalar )) || (scalar == 0.0 )) {
956
+ return enif_make_badarg (env );
957
+ }
958
+
959
+ mx_ret .p = alloc_matrix (env , mx .p -> nrows , mx .p -> ncols );
960
+ for (i = 0 ; i < mx .p -> nrows ; i ++ ) {
961
+ for (j = 0 ; j < mx .p -> ncols ; j ++ ) {
962
+ POS (mx_ret .p , i , j ) = POS (mx .p , i , j ) / scalar ;
963
+ }
964
+ }
965
+
966
+ ret = enif_make_resource (env , mx_ret .p );
967
+ enif_release_resource (mx_ret .p );
968
+ return ret ;
969
+ }
970
+
971
+ static ERL_NIF_TERM add_matrices (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
972
+ {
973
+ unsigned i , j ;
974
+ ERL_NIF_TERM ret ;
975
+ mx_t mx1 , mx2 , mx ;
976
+ mx1 .p = NULL ;
977
+ mx2 .p = NULL ;
978
+ mx .p = NULL ;
979
+
980
+ if (!enif_get_resource (env , argv [0 ], resource_type , & mx1 .vp ) || !enif_get_resource (env , argv [1 ], resource_type , & mx2 .vp ) || mx1 .p -> nrows != mx2 .p -> nrows || mx1 .p -> ncols != mx2 .p -> ncols ) {
981
+ return enif_make_badarg (env );
982
+ }
983
+ mx .p = alloc_matrix (env , mx1 .p -> nrows , mx2 .p -> ncols );
984
+ for (i = 0 ; i < mx1 .p -> nrows ; i ++ ) {
985
+ for (j = 0 ; j < mx2 .p -> ncols ; j ++ ) {
986
+ POS (mx .p , i , j ) = POS (mx1 .p , i , j ) + POS (mx2 .p , i , j );
987
+ }
988
+ }
989
+ ret = enif_make_resource (env , mx .p );
990
+ enif_release_resource (mx .p );
991
+ return ret ;
992
+ }
993
+
994
+ static ERL_NIF_TERM subtract_matrices (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
995
+ {
996
+ unsigned i , j ;
997
+ ERL_NIF_TERM ret ;
998
+ mx_t mx1 , mx2 , mx ;
999
+ mx1 .p = NULL ;
1000
+ mx2 .p = NULL ;
1001
+ mx .p = NULL ;
1002
+
1003
+ if (!enif_get_resource (env , argv [0 ], resource_type , & mx1 .vp ) || !enif_get_resource (env , argv [1 ], resource_type , & mx2 .vp ) || mx1 .p -> nrows != mx2 .p -> nrows || mx1 .p -> ncols != mx2 .p -> ncols ) {
1004
+ return enif_make_badarg (env );
1005
+ }
1006
+ mx .p = alloc_matrix (env , mx1 .p -> nrows , mx2 .p -> ncols );
1007
+ for (i = 0 ; i < mx1 .p -> nrows ; i ++ ) {
1008
+ for (j = 0 ; j < mx2 .p -> ncols ; j ++ ) {
1009
+ POS (mx .p , i , j ) = POS (mx1 .p , i , j ) - POS (mx2 .p , i , j );
1010
+ }
1011
+ }
1012
+ ret = enif_make_resource (env , mx .p );
1013
+ enif_release_resource (mx .p );
1014
+ return ret ;
1015
+ }
855
1016
856
1017
static ErlNifFunc nif_funcs [] =
857
1018
{
@@ -877,6 +1038,12 @@ static ErlNifFunc nif_funcs[] =
877
1038
{ "run_session" , 5 , run_session },
878
1039
{ "load_image_as_tensor" , 1 , load_image_as_tensor },
879
1040
{ "load_csv_as_matrix" , 3 , load_csv_as_matrix },
1041
+ { "add_scalar_to_matrix" , 2 , add_scalar_to_matrix },
1042
+ { "subtract_scalar_from_matrix" , 2 , subtract_scalar_from_matrix },
1043
+ { "multiply_matrix_with_scalar" , 2 , multiply_matrix_with_scalar },
1044
+ { "divide_matrix_by_scalar" , 2 , divide_matrix_by_scalar },
1045
+ { "add_matrices" , 2 , add_matrices },
1046
+ { "subtract_matrices" , 2 , subtract_matrices },
880
1047
};
881
1048
882
1049
ERL_NIF_INIT (Elixir .Tensorflex .NIFs , nif_funcs , res_loader , NULL , NULL , NULL )
0 commit comments