Hello all,

     An attempt to answer at least some of your questions:

On Wed, Mar 21, 2012 at 9:07 PM, Ted Byers <r.ted.by...@gmail.com> wrote:
> // I find the following distastefully wasteful.  I would have preferred to
> have the GSL functions work directly on std::vectors instead
> // of having to allocate new memory and bear the cost of the loop and
> copying all the data.  Indeed, I'd have hoped for expression
> // templates, to make these functions all the more efficient.

     GSL was designed with C and never attempted to work well with
C++ vector types. In the case of STL vectors, you can use
gsl_vector_view_array (double * base, size_t n) and just set base
to the address of the first std::vector element. It might be possible
to make that work with matrices also, but in the code above it's
likely easier (and not that much slower) just to work with the
GSL vector types from the beginning, so you can make the call to
the SVD directly.

     Even boost+STL is not immune from difficulties of this kind. The
way to do SVD within boost is to use ublas, but ublas vectors
aren't trivially compatible with STL vectors either (unless they
have the same size). This is why I always write my linear
algebra functions as template functions which accept any
reasonably formed vector and matrix types (but I don't have
SVD yet).

> I assume from your allocate and free family of functions that I can't create
> the vectors and matrices using operator new, and free them using operator
> delete, and thus give management of them to a smart pointer.  How, then, do
> you manage to maintain exception safety?

     There's no need for a smart pointer, you just have to check
the allocation of each vector separately and free up all of the
previously successful allocations in the case that one fails. Alternatively,
you can embed the vectors into a class, ensuring that the destructor
takes care of the deallocation in the usual way.

HTH,
Andrew
http://o2scl.sourceforge.net

Reply via email to