Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

GNU Scientific Library determinant of complex array help

  1. Mar 15, 2012 #1
    So I suck at programming, but I need to find the determinant of a complex 6x6 array using GSL in C (not GSL complex, complex.h complex). Here is what has failed so far starting with a 6x6 double complex array named mymatrix:

    gsl_matrix_complex_view m = gsl_matrix_complex_view_array(mymatrix, 6, 6);
    int s;
    gsl_permutation *p = gsl_permutation_alloc(6);
    gsl_linalg_complex_LU_decomp(&m.matrix, p, &s);
    gsl_complex det2 = gsl_linalg_complex_LU_det(&m.matrix, s);
    double complex det1 = GSL_REAL(det2)+I*GSL_IMAG(det2);

    I refuse to convert my entire program to GSL's complex stuff if you think that would fix it. Here is the error message when compiling in gcc:

    lorenz_odd_1.c: In function ‘det’:
    lorenz_odd_1.c:122:1: warning: passing argument 1 of ‘gsl_matrix_complex_view_array’ from incompatible pointer type
    /usr/local/include/gsl/gsl_matrix_complex_double.h:128:1: note: expected ‘double *’ but argument is of type ‘__complex__ double *’
     
    Last edited: Mar 15, 2012
  2. jcsd
  3. Mar 15, 2012 #2

    I like Serena

    User Avatar
    Homework Helper

    Welcome to PF, tosburn3! :smile:

    To make any function of GSL work with complex numbers, you need to convert your complex numbers to GSL complex stuff.

    Yeah... so I'm suggesting that one.
    Sorry.
     
  4. Mar 15, 2012 #3
    I don't care if I have to use GSL crap as intermediate steps. I just want to start with a regular complex array and end with a regular complex number. It was my understanding that:

    gsl_matrix_complex_view m = gsl_matrix_complex_view_array(mymatrix, 6, 6);

    Will take "mymatrix" and make a gsl_matrix_complex called "m", and then at the end I convert back to a regular complex number (quite inefficiently I might add).
     
  5. Mar 15, 2012 #4

    I like Serena

    User Avatar
    Homework Helper

    It does not matter if it's inefficient.
    In terms of performance, calculating a determinant is so much more computationally difficult, that a conversion of complex numbers matters not at all.
    It's only a little more code.

    But... what is your problem then?
     
  6. Mar 15, 2012 #5
    FWIW here is the error message when compiling with gcc (updated original post for recent version):

    lorenz_odd_1.c: In function ‘det’:
    lorenz_odd_1.c:122:1: warning: passing argument 1 of ‘gsl_matrix_complex_view_array’ from incompatible pointer type
    /usr/local/include/gsl/gsl_matrix_complex_double.h:128:1: note: expected ‘double *’ but argument is of type ‘__complex__ double *’
     
  7. Mar 15, 2012 #6
    Also, the inefficiency was actually that I computed the determinant once for the real part then again for the imaginary part, which would in fact take a lot longer.
     
  8. Mar 15, 2012 #7

    I like Serena

    User Avatar
    Homework Helper

    Oh okay, so your "mymatrix" is of the wrong type, apparently something like "double complex*".
    How did you define "mymatrix"?

    Anyway, I strongly recommend that you convert your mymatrix to the type gsl_matrix_complex_view_array() expects.
    Just allocate the gsl matrix and fill it with 2 for-loops.
    It really does not pay to try to make any shortcuts here.

    Generally any shortcuts work against you.
    If not now, then later.
     
  9. Mar 15, 2012 #8
    mymatrix is in fact a double complex. I will try that.
     
  10. Mar 15, 2012 #9
    While I'm still not sure why the other way didn't work, looping through each component seems to work. At least it compiles...

    Thanks!
     
  11. Mar 15, 2012 #10

    I like Serena

    User Avatar
    Homework Helper

  12. Mar 15, 2012 #11

    AlephZero

    User Avatar
    Science Advisor
    Homework Helper

    Alternatively you could use LAPACK, which will work on an ordinary Fortran array.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: GNU Scientific Library determinant of complex array help
  1. GNU fortran help (Replies: 22)

Loading...