I was thinking of adding two routines to GSL, to increment a single element of a matrix or vector by some amount, since I'm always doing things like: gsl_vector_set(v, i, gsl_vector_get(v, i) + x); which I think is ugly and annoying. Something like: gsl_vector_add_element(v, i, x); or gsl_matrix_add_element(m, i, j, x); would be really nice. Does anyone have any better suggestions for the function name? Or also is there another solution to this problem that I don't know about? Patrick
> I was thinking of adding two routines to GSL, to increment a single element > of a matrix or vector by some amount, since I'm always doing things like: > > gsl_vector_set(v, i, gsl_vector_get(v, i) + x); > > which I think is ugly and annoying.... Agreed. This has often bugged me. > Or also is there another solution to this problem that I don't know about? How about using INLINE_DECL double * gsl_vector_ptr (gsl_vector * v, const size_t i); to say *gsl_vector_ptr(v, i) += x ? Never knew about this until I just went fishing for it. - Rhys
> *gsl_vector_ptr(v, i) += x
Of course, make sure warnings about expressions without side effects
are turned on. Otherwise it may be a long debugging session before
you discover a
gsl_vector_ptr(v, i) += x
mistake for integer-like types.
- Rhys
On 01/27/2014 07:14 PM, Rhys Ulerich wrote:
>> *gsl_vector_ptr(v, i) += x
>
> Of course, make sure warnings about expressions without side effects
> are turned on. Otherwise it may be a long debugging session before
> you discover a
>
> gsl_vector_ptr(v, i) += x
>
> mistake for integer-like types.
>
> - Rhys
>
Nice find - unfortunately since it returns a pointer to the element, you
need to do:
*(gsl_vector_ptr(v, i)) += x;
This could lead to trouble so its probably better to have a function
which does range checking, etc. I'll think a little more on a good way
to do this.
Thanks,
Patrick
The functions gsl_vector_inc and gsl_matrix_inc are now in the git
repository to accomplish this
On 01/27/2014 08:06 PM, Patrick Alken wrote:
> On 01/27/2014 07:14 PM, Rhys Ulerich wrote:
>>> *gsl_vector_ptr(v, i) += x
>> Of course, make sure warnings about expressions without side effects
>> are turned on. Otherwise it may be a long debugging session before
>> you discover a
>>
>> gsl_vector_ptr(v, i) += x
>>
>> mistake for integer-like types.
>>
>> - Rhys
>>
> Nice find - unfortunately since it returns a pointer to the element, you
> need to do:
>
> *(gsl_vector_ptr(v, i)) += x;
>
> This could lead to trouble so its probably better to have a function
> which does range checking, etc. I'll think a little more on a good way
> to do this.
>
> Thanks,
> Patrick
>>>> *gsl_vector_ptr(v, i) += x >> *(gsl_vector_ptr(v, i)) += x; Why the extra parens? They hurt nothing, but the former statement without them works just fine for me. Unless I'm mistaken, the function application happens before the dereference. And the dereference is much, much higher than anything like += or *= that the user might want. >> This could lead to trouble so its probably better to have a function >> which does range checking, etc. There is range checking in gsl_vector_ptr, so long as someone doesn't start doing pointer arithmetic on its result. Lastly, the pointer-based solution is nicely general: *(i > j ? gsl_vector_ptr(v, i) : gsl_vector_ptr(j)) += 1 - Rhys
On 01/28/2014 02:16 PM, Rhys Ulerich wrote: >>>>> *gsl_vector_ptr(v, i) += x >>> *(gsl_vector_ptr(v, i)) += x; > Why the extra parens? They hurt nothing, but the former statement > without them works just fine for me. Unless I'm mistaken, the > function application happens before the dereference. And the > dereference is much, much higher than anything like += or *= that the > user might want. Yes sorry I didn't see the * the first time I read that >>> This could lead to trouble so its probably better to have a function >>> which does range checking, etc. > There is range checking in gsl_vector_ptr, so long as someone doesn't > start doing pointer arithmetic on its result. > > Lastly, the pointer-based solution is nicely general: *(i > j ? > gsl_vector_ptr(v, i) : gsl_vector_ptr(j)) += 1 > > - Rhys Hmm ok you convinced me, I'll reverse those last few commits