Message Boards Message Boards


Working with complex numbers in LibraryLink

Posted 7 years ago
1 Reply
3 Total Likes
In a previous post I explained how to create a matrix with integer values when passing in a row and column argument.
In this post we are going to look at a data type we have not previously used: complex numbers (mcomplex). Unlike reals,
integers and strings this data type is a compound type with both a real and imaginary part which can be extracted using
mcreal(z) and mcimag(z). In this example we will extract both parts and return them back as a list to the calling Wolfram
Language function.

Here is the C code (ReIm.c):

 #include "WolframLibrary.h"
 DLLEXPORT int ReIm(WolframLibraryData libData, mint Argc, MArgument *Args, MArgument Res) {
         mcomplex z;
         mreal re,im;
         MTensor out;
        mint out_type;
        mint out_rank;
        mint* out_dims;
        mint* out_pos;
        int err;

        z = MArgument_getComplex(Args[0]);
        re = mcreal(z);
        im = mcimag(z);

        out_type = MType_Real;
        out_rank = 1;
        out_dims[0] = 2;
        err = libData->MTensor_new(out_type, out_rank, out_dims, &out);
        out_pos[0] = 1;
        err = libData->MTensor_setReal(out, out_pos, re);
        out_pos[0] = 2;
        err = libData->MTensor_setReal(out, out_pos, im);
        return LIBRARY_NO_ERROR;

Here we get the complex number by calling MArgument_getComplex on the first argument and immediately split it up into
its real and imaginary part using mcreal(z) and mcimag(z). To return these parts as a list we need to create a tensor
with one dimension (a list) and length 2. After creating this tensor we need to set the elements of the list with libData->MTensor_setReal
and finally return the result.

The following Wolfram Language code (ReIm.m) creates the library and loads the LibraryLink function. Note that the function expect a
single complex number as its input and will return a list of real numbers (of length two in this case):

lib = CreateLibrary[{"ReIm.c"},"ReIm"];
ReIm = LibraryFunctionLoad[lib,"ReIm",{Complex},{Real,1}];

Now we can try running this code in the Wolfram Language:

 Mathematica 10.0 for Microsoft Windows (64-bit)
 Copyright 1988-2013 Wolfram Research, Inc.
 In[1]:= Get["ReIm.m"]
 In[2]:= ReIm[0]
 Out[2]= {0., 0.}

In[3]:= ReIm[I]

Out[3]= {0., 1.}

In[4]:= ReIm[Log[-1]]

Out[4]= {0., 3.14159}

In[5]:= ReIm[2.3+6.5*I]

Out[5]= {2.3, 6.5}

Note how Log[-1] gets evaluated to I*Pi before it is sent to the LibraryLink function. Integers and constants with a numerical value
are automatically converted to their real number approximation.

Next, let's take a look at how to work with multiple functions in LibraryLink.


It seems as though MMA already has a function called "ReIm" ( which means that you are calling that function in your MMA evaluation (as opposed to using your custom ReIm function).

Also, I tried evaluating your code and MMA crashes regardless of the input. Will keep looking for the error and get back to you if I find it!

All the best,

Ivan S.

Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
or Discard

Group Abstract Group Abstract