Skip to content

Commit 6d88572

Browse files
authored
Merge pull request #35 from anshuman23/dev
Added new matrix operations
2 parents 7f00657 + 2682ae1 commit 6d88572

File tree

4 files changed

+568
-37
lines changed

4 files changed

+568
-37
lines changed

Diff for: c_src/Tensorflex.c

+167
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,167 @@ static ERL_NIF_TERM load_csv_as_matrix(ErlNifEnv *env, int argc, const ERL_NIF_T
852852
return mat_ret;
853853
}
854854

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+
}
8551016

8561017
static ErlNifFunc nif_funcs[] =
8571018
{
@@ -877,6 +1038,12 @@ static ErlNifFunc nif_funcs[] =
8771038
{ "run_session", 5, run_session },
8781039
{ "load_image_as_tensor", 1, load_image_as_tensor },
8791040
{ "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 },
8801047
};
8811048

8821049
ERL_NIF_INIT(Elixir.Tensorflex.NIFs, nif_funcs, res_loader, NULL, NULL, NULL)

Diff for: lib/nifs.ex

+24
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,28 @@ defmodule Tensorflex.NIFs do
9595
raise "NIF run_session/5 not implemented"
9696
end
9797

98+
def add_scalar_to_matrix(_mat, _scalar) do
99+
raise "NIF add_scalar_to_matrix/2 not implemented"
100+
end
101+
102+
def subtract_scalar_from_matrix(_mat, _scalar) do
103+
raise "NIF subtract_scalar_from_matrix/2 not implemented"
104+
end
105+
106+
def multiply_matrix_with_scalar(_mat, _scalar) do
107+
raise "NIF multiply_matrix_with_scalar/2 not implemented"
108+
end
109+
110+
def divide_matrix_by_scalar(_mat, _scalar) do
111+
raise "NIF divide_matrix_by_scalar/2 not implemented"
112+
end
113+
114+
def add_matrices(_mat1, _mat2) do
115+
raise "NIF add_matrices/2 not implemented"
116+
end
117+
118+
def subtract_matrices(_mat1, _mat2) do
119+
raise "NIF subtract_matrices/2 not implemented"
120+
end
121+
98122
end

0 commit comments

Comments
 (0)