Hello,
I am trying to use Mexfunction in the matlab but I got a problem.
#include "mex.h"#include "blas.h"#include <stdio.h>#include <math.h>#include <stdlib.h>/* The computational routine */void findvalue(double *Vnew, double *V, double *Vp, double *Ptrans, double *U, double *C, double *Y, double *A, double R, double sig, double beta, double it, double itmax, double tol, double dif, int Na, int Ny, double *Z){while (dif >= tol && it <= itmax) { it = it + 1; for (int i = 0; i < Na; i++) { for (int j = 0; j < Ny; j++) { /*V[i][j] = Vnew[i][j];*/ V[j+i*Ny] = Vnew[j+i*Ny]; } } for (int a=0; a<Na; a++) { for (int b=0; b<Ny; b++){ for (int c=0; c<Na; c++){ C[c] = Y[b] + A[a] - A[c]/R; if (C[c] >= 0) { U[c] = 1 / (1 - 1 / sig) * pow(C[c], 1 - 1 / sig); } else { U[c] = -9999999999999 -1; } for (int d = 0; d < Ny; d++) { /*Vp[c] = U[c] + beta * (V[c][d] * Ptrans[d] + V[c][d] * Ptrans[d] + V[c][d] * Ptrans[d]);*/ Vp[c] = U[c] + beta * (V[d+c*Ny] * Ptrans[d] + V[d+c*Ny] * Ptrans[d] + V[d+c*Ny] * Ptrans[d]); } /*Vnew[a][b] = Vp[0];*/ Vnew[b+a*Ny] = Vp[0]; for (int i = 1; i < Na; i++) { if /*(Vp[i] > Vnew[a][b])*/(Vp[i] > Vnew[b+a*Ny]){ /* Vnew[a][b] = Vp[i];*/ Vnew[b+a*Ny] = Vp[i]; } else { /*Vnew[a][b] = Vnew[a][b];*/ Vnew[b+a*Ny] = Vnew[b+a*Ny]; } } } }}double tempdiff[Na*Ny];for (int i = 0; i < Na; i++) { for (int j = 0; j < Ny; j++) { /*tempdiff[i][j] = abs(V[i][j] - Vnew[i][j]);*/ tempdiff[j+i*Ny] = abs(V[j+i*Ny] - Vnew[j+i*Ny]); }}dif = tempdiff[0];for (int i = 0; i < Na; i++) { for (int j = 0; j < Ny; j++) { if (tempdiff[j+i*Ny] > dif) { dif = tempdiff[j+i*Ny]; } else { dif = dif; } }}}for (int i = 0; i < Na; i++) {for (int j = 0; j < Ny; j++) { Z[j+i*Ny] = Vnew[j+i*Ny];}}}/* The gateway function */void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){ double *outMatrix; /* output matrix */double *Vnewmatrix;double *Vmatrix;double *Z;double *Vpmatrix;double *Ptransmatrix;double *Umatrix;double *Cmatrix; double *Ymatrix; double *Amatrix; double Rscalar;double sigscalar;double betascalar;double itscalar;double itmaxscalar;double tolscalar;double difscalar;int Nascalar;int Nyscalar;/* get the value of the scalar input */Vnewmatrix = mxGetPr(prhs[0]);Vmatrix = mxGetPr(prhs[1]);Vpmatrix = mxGetPr(prhs[2]);Ptransmatrix = mxGetPr(prhs[3]);Umatrix = mxGetPr(prhs[4]);Cmatrix = mxGetPr(prhs[5]);Ymatrix = mxGetPr(prhs[6]);Amatrix = mxGetPr(prhs[7]);Rscalar = mxGetScalar(prhs[8]);sigscalar = mxGetScalar(prhs[9]);betascalar = mxGetScalar(prhs[10]);itscalar = mxGetScalar(prhs[11]);itmaxscalar = mxGetScalar(prhs[12]);tolscalar = mxGetScalar(prhs[13]);difscalar = mxGetScalar(prhs[14]);Nascalar = mxGetScalar(prhs[15]);Nyscalar = mxGetScalar(prhs[16]); /* create the output matrix */plhs[0] = mxCreateDoubleMatrix(Nascalar, Nyscalar ,mxREAL);/* get a pointer to the real data in the output matrix */outMatrix = mxGetPr(plhs[0]);/* call the computational routine */findvalue(Vnewmatrix, Vmatrix, Vpmatrix, Ptransmatrix, Umatrix, Cmatrix, Ymatrix, Amatrix, Rscalar, sigscalar, betascalar, itscalar, itmaxscalar, tolscalar, difscalar, Nascalar, Nyscalar, outMatrix); }
And I saved this as optsavlooptest2.c in the folder
Then I made a new code
clear all;clc;ticcd 'C:\Users\chang\Desktop\New Folder'mex optsavlooptest2.c% ================ 1. Parameters and Constants ============================
%Iteration Parameters
tol = 0.0001;itmax = 1000;%Model Parameters and utility function
sig = 0.75; %intertemporal elasticity of substitution
beta = 0.95; %discount factor
R = 1/beta - 0.00215;Utility = @(X) (1/(1-1/sig)*X^(1-1/sig));% =============== 2. Discretizing the state space =========================
%Variables for discretization of state space
Amin = -20;Amax = 60;Na = 4*80;Ymin = 2;Ymax = 6;Ny = 3;%Discretization of state space
A = linspace(Amin, Amax, Na);Y = linspace(Ymin, Ymax, Ny);% === 3. Initial guesses, Variable initialization and Transition matrix ===
%Initial guess for value function
V = ones(Na,Ny);%Initialization of other variables
C = ones(Na,1);U = ones(Na,1);Ptrans = [1/3 1/3 1/3]';Vnew = ones(Na,Ny);Vp = ones(Na,1);%Value function iteration
it = 0;dif = 1;% ================ 4. Value function iteration ============================
AAA = findvalue(Vnew, V, Vp, Ptrans, U, C, Y, A, R, sig, beta, it, itmax, tol, dif, Na, Ny);
Then when I run the last line, I got en error code: Undefined function or variable 'findvalue'
I think I already made a function findvalue in optsavlooptest2.c file so I have no idea why this problem happens.
Any solutions for this situation?
Thanks in advance.
Best Answer