Matlab 2017a mex of mandelbrot_step.c
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
Bert RAM Aerts
am 12 Mär. 2017
Kommentiert: Bert RAM Aerts
am 12 Mär. 2017
In the book "Experiments with Matlab" of Cleve Moler (free ebook)
with source code
In chapter "Mandelbrot set" there is a file mandelbrot_step.c which can be compiled by mex.
Matlab crashes on it.
What should change in
#include <math.h>
#include "mex.h"
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[] )
/* function [z,kz] = mandelbrot_step(z,kz,z0,d);
* Take one step of the Mandelbrot iteration.
* Complex arithmetic:
* z = z.^2 + z0
* kz(abs(z) < 2) == d
* Real arithmetic:
* x <-> real(z);
* y <-> imag(z);
* u <-> real(z0);
* v <-> imag(z0);
* [x,y] = [x.^2-y.^2+u, 2*x.*y+v];
* kz(x.^2+y.^2 < 4) = d;
*/
{
double *x,*y,*u,*v,t;
unsigned short *kz,d;
int j,n;
x = mxGetPr(prhs[0]);
y = mxGetPi(prhs[0]);
kz = (unsigned short *) mxGetData(prhs[1]);
u = mxGetPr(prhs[2]);
v = mxGetPi(prhs[2]);
d = (unsigned short) mxGetScalar(prhs[3]);
plhs[0] = prhs[0];
plhs[1] = prhs[1];
n = mxGetN(prhs[0]);
for (j=0; j<n*n; j++) {
if (kz[j] == d-1) {
t = x[j];
x[j] = x[j]*x[j] - y[j]*y[j] + u[j];
y[j] = 2*t*y[j] + v[j];
if (x[j]*x[j] + y[j]*y[j] < 4) {
kz[j] = d;
}
}
}
return;
}
My mex compiler is Microsoft Visual Studio 2015 Community Edition.
0 Kommentare
Akzeptierte Antwort
Jan
am 12 Mär. 2017
Please try this:
unsigned short ==> uint16_T
int ==> size_t
Writing into the input array and replying it as output is, well, bold. The officially supported way is (James, please correct me on demand):
plhs[0] = mxDuplicateArray(prhs[0]);
plhs[1] = mxDuplicateArray(prhs[1]);
x = mxGetPr(plhs[0]);
y = mxGetPi(plhs[0]);
kz = (uint16_T *) mxGetData(plhs[1]);
u = mxGetPr(prhs[2]);
v = mxGetPi(prhs[2]);
d = (unsigned short) mxGetScalar(prhs[3]);
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Write C Functions Callable from MATLAB (MEX Files) finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!