- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi!
I want to generate random numbers from a multivariate normal distribution with parameters mu =
[3.0 5.0 2.0] and sigma =
[ 16.0 8.0 4.0; 8.0 13.0 17.0; 4.0 17.0 62.0].
I wrote a mex-code using the the function vdRngGaussianMV and the results of the simulation are
>> mean(out)
ans =
3.4558 2.9934 3.3013
>> cov(out)
ans =
146.5081 -1.9068 -2.1787
-1.9068 144.7461 -0.7771
-2.1787 -0.7771 142.3955
Could you please tell me what I am doing wrong.
Thank you very much.
The code is the following:
#include <math.h> #include <stdio.h> #include <stdlib.h> #include <mkl.h> #include "mkl_vml.h" #include "mex.h" #include "matrix.h" #include "mkl_vsl.h" #include <time.h> #define SEED time(NULL) #define BRNG VSL_BRNG_MCG31 // VSL basic generator to be used double normalMVN(int npars, int N, double *cov, double *mean, double *out); /* main fucntion */ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { int npars, N; double *cov, *mean, *out; /* make pointers to input data */ npars = (int)mxGetScalar(prhs[0]); N = (int)mxGetScalar(prhs[1]); cov = mxGetPr(prhs[2]); mean = mxGetPr(prhs[3]); /* make pointers to output data */ plhs[0] = mxCreateDoubleMatrix( N, npars, mxREAL); out = mxGetPr(plhs[0]); /* call */ normalMVN(npars, N, cov, mean, out); return 0; } double normalMVN(int npars, int N, double *cov, double *mean, double *out) { /* This we need it for distributions */ VSLSSTaskPtr task; VSLStreamStatePtr stream; char uplo; int i, j, n, lda, info; double *T, fiori[3]; T = (double *)mxMalloc( npars*npars*sizeof( double* ) ); uplo = 'L'; n = npars; lda = npars; cblas_dcopy(npars*npars, cov, 1, T, 1); dpotrf( &uplo, &n, T, &lda, &info ); if(info != 0){mexPrintf("c++ error: Cholesky failed\n\n");} vslNewStream( &stream, BRNG, SEED ); vdRngGaussianMV( VSL_METHOD_DGAUSSIANMV_BOXMULLER2, stream, N, out, npars, VSL_MATRIX_STORAGE_FULL, mean, T ); vslDeleteStream( &stream ); /* Free memory */ mxFree(T); return 0; }
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Thanks for the generated data. I reproduced covariance and mean estimates with your dataset. This indicates the bug in that version of Intel MKL. I attach C test case that was based on the your code, and the output produced by this test case. For the experiments I used Intel MKL from Intel Parallel Studio 2016 for Linux. Can you please download the latest version of the Studio and run the experiments with it?
Thanks, Andrey
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Per quick analysis of your code, it makes sense to apply a few corrections:
- replace uplo = 'L'
; with uplo = 'U';
-remove '*' in sizeof( double* ) in T = (double
*)mxMalloc( npars*npars*
sizeof
(
double
* ) );
For debugging purposes can you please set SEED to a fixed number, provide value of N, and the data set you get from the generator for those parameters (I assume N is not huge, something like ~1000) ? It would help to compare the results on your and our side.
Also, which library version do you use?
Andrey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello.
I corrected the code as you proposed. I set the SEED equal to 777, npars =3, N=5000, sigma = [ 16.0 8.0 4.0; 8.0 13.0 17.0; 4.0 17.0 62.0];, m=[3.0 5.0 2.0]; I have installed on my pc "Intel Parallel Studio XE 2013 SP1, Update 2 for Windows".
I run the code with the command out = fio(npars, N, sigma, m); and the results are
>> mean(out)
ans =
3.3099 3.4070 3.3614
>> cov(out)
ans =
32.5436 -0.5491 -0.9751
-0.5491 29.8680 -0.6707
-0.9751 -0.6707 32.0381
>>
Please see the attached txt for the simulated data.
The corrected code is:
#include <math.h> #include <stdio.h> #include <stdlib.h> #include <mkl.h> #include "mkl_vml.h" #include "mex.h" #include "matrix.h" #include "mkl_vsl.h" #include <time.h> #define SEED 777 #define BRNG VSL_BRNG_MCG31 // VSL basic generator to be used double normalMVN(int npars, int N, double *cov, double *mean, double *out); /* main fucntion */ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { int npars, N; double *cov, *mean, *out; /* make pointers to input data */ npars = (int)mxGetScalar(prhs[0]); N = (int)mxGetScalar(prhs[1]); cov = mxGetPr(prhs[2]); mean = mxGetPr(prhs[3]); /* make pointers to output data */ plhs[0] = mxCreateDoubleMatrix( N, npars, mxREAL); out = mxGetPr(plhs[0]); /* call */ normalMVN(npars, N, cov, mean, out); return 0; } double normalMVN(int npars, int N, double *cov, double *mean, double *out) { char uplo; int i, j, n, lda, info; double *T; /* This we need it for distributions */ VSLSSTaskPtr task; VSLStreamStatePtr stream; vslNewStream( &stream, BRNG, SEED ); /* Following variables are used in Cholesky factorization subroutine */ T = mxMalloc( npars*npars*sizeof( double ) ); uplo = 'U'; n = npars; lda = npars; cblas_dcopy(npars*npars, cov, 1, T, 1); /* MKL Choelsky factorization routine call */ dpotrf( &uplo, &n, T, &lda, &info ); if(info != 0){mexPrintf("c++ error: Cholesky failed\n\n");} /***************************************************** * Generating random numbers * from multivariate normal distribution *****************************************************/ vdRngGaussianMV( VSL_METHOD_DGAUSSIANMV_BOXMULLER2, stream, N, out, npars, VSL_MATRIX_STORAGE_FULL, mean, T ); vslDeleteStream( &stream ); /* Free memory */ mxFree(T); return 0; }
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Thanks for the generated data. I reproduced covariance and mean estimates with your dataset. This indicates the bug in that version of Intel MKL. I attach C test case that was based on the your code, and the output produced by this test case. For the experiments I used Intel MKL from Intel Parallel Studio 2016 for Linux. Can you please download the latest version of the Studio and run the experiments with it?
Thanks, Andrey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi!
I really appreciate your help. I installed on my pc 'Intel® Parallel Studio XE Cluster Edition , 2016 for Windows' but I don't know how to run my mex-code. With "Intel Parallel Studio XE 2013 SP1" I used the command
'mex -v -g phi1c.c -I"C:\Program Files (x86)\Intel\Composer XE 2013 SP1\mkl\include" -L"C:\Program Files (x86)\Intel\Composer XE 2013 SP1\mkl\lib\intel64" -lmkl_intel_lp64 -lmkl_core -lmkl_sequential -lmkl_cdft_core -lmkl_intel_thread'
Could you please tell me if you know what to do?
Thank you very much.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi GF G.,
Are you asking the eqivalent folder in Intel® Parallel Studio XE Cluster Edition , 2016 for Windows?
We changed the folder a little, for example,
C:\Program Files (x86)\Intel\Composer XE 2013 SP1\mkl
in
C:\Program Files (x86)\Intel_sw_development_tools\parallel_studio_xe_2016.0.0.xx\compilers_and_libraries_2016\windows\mkl
You may replace them in your command
Best Regards
Ying
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page