add isl_vec_mat_product
authorSven Verdoolaege <skimo@kotnet.org>
Sat, 15 Aug 2009 09:08:13 +0000 (11:08 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Fri, 28 Aug 2009 17:42:19 +0000 (19:42 +0200)
isl_mat.c
isl_mat.h

index c96017e..5cc2526 100644 (file)
--- a/isl_mat.c
+++ b/isl_mat.c
@@ -236,6 +236,34 @@ error:
        return NULL;
 }
 
+struct isl_vec *isl_vec_mat_product(struct isl_vec *vec, struct isl_mat *mat)
+{
+       int i, j;
+       struct isl_vec *prod;
+
+       if (!mat || !vec)
+               goto error;
+
+       isl_assert(ctx, mat->n_row == vec->size, goto error);
+
+       prod = isl_vec_alloc(mat->ctx, mat->n_col);
+       if (!prod)
+               goto error;
+
+       for (i = 0; i < prod->size; ++i) {
+               isl_int_set_si(prod->el[i], 0);
+               for (j = 0; j < vec->size; ++j)
+                       isl_int_addmul(prod->el[i], vec->el[j], mat->row[j][i]);
+       }
+       isl_mat_free(mat);
+       isl_vec_free(vec);
+       return prod;
+error:
+       isl_mat_free(mat);
+       isl_vec_free(vec);
+       return NULL;
+}
+
 struct isl_mat *isl_mat_aff_direct_sum(struct isl_mat *left,
        struct isl_mat *right)
 {
index ed82ec2..6e44a96 100644 (file)
--- a/isl_mat.h
+++ b/isl_mat.h
@@ -53,6 +53,7 @@ struct isl_mat *isl_mat_swap_cols(struct isl_mat *mat, unsigned i, unsigned j);
 struct isl_mat *isl_mat_swap_rows(struct isl_mat *mat, unsigned i, unsigned j);
 
 struct isl_vec *isl_mat_vec_product(struct isl_mat *mat, struct isl_vec *vec);
+struct isl_vec *isl_vec_mat_product(struct isl_vec *vec, struct isl_mat *mat);
 struct isl_mat *isl_mat_aff_direct_sum(struct isl_mat *left,
                                        struct isl_mat *right);
 struct isl_mat *isl_mat_left_hermite(struct isl_mat *M,