INT_VECTOR int_vec_div(INT_VECTOR A, INT_VECTOR B, INT_VECTOR result) { int i, m; m = Int_VecLen(A); if(result==NULL) if((result = int_vec_creat(m, UNDEFINED))==NULL) int_vec_error(INT_VEC_MALLOC); if(m!=Int_VecLen(B)) gen_error(GEN_SIZEMISMATCH); #pragma omp parallel for for(i=0; i<m; ++i) result[i] = A[i]/B[i]; return result; }
INT_VECTOR int_vec_fill(INT_VECTOR A, int val) { int i, n; n = Int_VecLen(A); for(i=0; i<n; ++i) A[i] = val; return A; }
INT_VECTOR int_vec_copy(INT_VECTOR a, INT_VECTOR result) { int i, m; m = Int_VecLen(a); if(result==NULL) if((result = int_vec_creat(m, UNDEFINED))==NULL) int_vec_error(INT_VEC_MALLOC); for(i=0; i<m; ++i) result[i] = a[i]; return result; }
int int_vec_free(INT_VECTOR A) { if(A==NULL) return 0; Int_VecLen(A) = 0; free(A-1); A = NULL; return 1; }
INT_VECTOR mat_get_sub_vector(INT_VECTOR a, INT_VECTOR indices) { int i, n; INT_VECTOR subvec; n = Int_VecLen(indices); subvec = int_vec_creat(n, UNDEFINED); for(i=0; i<n; ++i)subvec[i] = a[indices[i]]; return subvec; }
INT_VECTOR int_vec_concat(INT_VECTOR a, INT_VECTOR b, INT_VECTOR result) { int i, m, n; m = Int_VecLen(a); n = Int_VecLen(b); if(result==NULL) { if((result = int_vec_creat(m+n, UNDEFINED))==NULL) return NULL; } else { if(Int_VecLen(result)!=(m+n)) return int_vec_error(INT_VEC_SIZEMISMATCH); } #pragma omp parallel for for(i=0; i<m; ++i) result[i] = a[i]; #pragma omp parallel for for(i=0; i<n; ++i) result[i+m] = b[i]; return result; }
INT_VECTOR int_vec_divs_inv(INT_VECTOR A, int s, INT_VECTOR result) { int i, m; m = Int_VecLen(A); if(result==NULL) if((result = int_vec_creat(m, UNDEFINED))==NULL) int_vec_error(INT_VEC_MALLOC); #pragma omp parallel for for(i=0; i<m; ++i) result[i] = s/A[i]; return result; }
INT_VECTOR int_vec_append(INT_VECTOR a, int i) { int l; l = Int_VecLen(a); a--; if((a = (int *)realloc(a, sizeof(int)*(l+2)))==NULL) return int_vec_error(INT_VEC_MALLOC); a[0]= l+1; ++a; a[l] = i; return a; }
MATRIX mat_get_sub_matrix_from_cols(MATRIX A, INT_VECTOR indices, MATRIX result) { int i, j, k, n; k = MatRow(A); n = Int_VecLen(indices); if(result==NULL) if((result = mat_creat(k, n, UNDEFINED))==NULL) return mat_error(MAT_MALLOC); for(i=0; i<n; ++i) { for(j=0; j<k; ++j) result[j][i] = A[j][indices[i]]; } return result; }
INT_VECTOR int_vec_fill_type(INT_VECTOR A, int type) { int i, n; n = Int_VecLen(A); switch(type) { case UNDEFINED: break; case ZERO_INT_VECTOR: for(i=0; i<n; ++i) A[i] = 0; break; case ONES_INT_VECTOR: for(i=0; i<n; ++i) A[i] = 1; break; case SERIES_INT_VECTOR: for(i=0; i<n; ++i) A[i] = i; break; } return A; }
INT_VECTOR int_vec_unique(INT_VECTOR a) { int i, l, uni_l = 0; mtype *ordered = NULL, **p_ordered; INT_VECTOR int_ordered = NULL; MAT_TREE s; p_ordered = &ordered; l = Int_VecLen(a); s = mat_bs_make_null(); for (i = 0; i<l; ++i) { s = mat_bs_insert((mtype)a[i],s); } uni_l = mat_bs_inorder(s, uni_l, p_ordered); int_ordered = int_vec_creat(uni_l, UNDEFINED); for(i = 0; i< uni_l; ++i) int_ordered[i] = (int)ordered[i]; free(ordered); s = mat_bs_free(s); return int_ordered; }