CAMLprim value ml_gsl_blas_sger(value alpha, value X, value Y, value A) { _DECLARE_MATRIX(A); _DECLARE_VECTOR2(X, Y); _CONVERT_MATRIX(A); _CONVERT_VECTOR2(X, Y); gsl_blas_sger(Double_val(alpha), &v_X, &v_Y, &m_A); return Val_unit; }
// We need to compute something like: // sum_{k != i, j} \lambda_{i,k} x_i q_k(x_k = 1) // = x_i (\sum \lambda_{i, k} q_k(x_k = 1) - // \lambda_{i, j} q_j(x_j = 0)) // (note that lambda_{i, i} = 0) unsigned int estimateExpectations() { // estimates_{x,y} = lambda_{x,y} gsl_matrix_float_memcpy(estimates_, lambda_); // estimates_{x,y} = lambda_{x,y} + kappa_x gsl_blas_sger(1.0, ones_, kappa_, estimates_); // estimates_{x,y} = lambda_{x,y} + kappa_x + kappa_y gsl_blas_sger(1.0, kappa_, ones_, estimates_); gsl_vector_float_set_zero(q_lambda_); gsl_blas_sgemv(CblasNoTrans, 1.0, lambda_, singleton_expectation_, 1.0, q_lambda_); // estimates_{x,y} = lambda_{x,y} + kappa_x + kappa_y // + E_q [ sum lambda_{x, z} + lambda_{z, y} ] gsl_blas_sger(1.0, ones_, q_lambda_, estimates_); gsl_blas_sger(1.0, q_lambda_, ones_, estimates_); }
/** * C++ version of gsl_blas_sger(). * @param alpha A constant * @param X A vector * @param Y A vector * @param A A matrix * @return Error code on failure */ int sger( float alpha, vector_float const& X, vector_float const& Y, matrix_float& A ){ return gsl_blas_sger( alpha, X.get(), Y.get(), A.get() ); }