|

Introduction
Following the line of the article posted by A.Riazi, Solving engineering problem using MATLAB C API, I will show in this small example how to use M Functions inside our VC++ 6 project.
The project calculates the convolution of two vectors, and shows the resulting vector in the MsChart control. The function that performs the convolution is written in MatLab and then through the MatLab Add-in converted to C code ready to be used inside our app.
Requirements
You need Visual Studio 6 and MatLab Release 12 installed with the MatLab C Library and Matlab Compiler.
Installing the MatLab Add-in
The add-in automates the integration of M-files into Visual C++ projects. The add-in for Visual Studio is automatically installed on your system when you run either mbuild -setup or mex -setup and select Microsoft Visual C/C++ version 6. In order to use the add-in you must follow these steps:
- Start MatLab, in the prompt type mbuild -setup
- Follow the menus and choose MS Visual C++6.0.
- Type the following commands in the matlab prompt :
cd (prefdir) mccsavepath
These commands save the MatLab path to a file called mccpath in your user preferences directory (prefdir), ussually inside your documents and settings file. The path is used by the add-in because it runs outside Matlab and there is no other way for it to determine your Matlab path. If you add new directories to your Matlab path you will have to rerun this command if you want the add-in to see them.
- Configure the Matlab Add-in for Visual Studio 6 to work within MSVisual C++.
- Open MSVisualC++.
- Select Tools -> Customize from the MSVC menu.
- Click on the Add-ins and Macro Files tab.
- Check MATLAB for Visual Studio on the Add-ins and Macro Files list and click Close.
The floating MATLAB add-in for Visual Studio toolbar appears. The checkmark directs MSVC to automatically load the add-in when you start MSVC again.
Calculating the convolution in Matlab
We will write a simple function in MatLab that will perform the convolution of two vectors:
In1 and In2 and store the result in out.
We actually can use any matlab built-in function or toolbox function inside our function here we use only the function conv for simplicity. function out=MyFunc(In1,In2)
%Returns the convolution of vector IN1 and IN2
out=conv(In1,In2);
Save the function with the name MyFunc.m
Writing the Application
Use the MFC AppWizard (exe) option to generate a Dialog Based Application and call it conv. Create a Button which will calculate the convolution of two given vectors.
Add the code below to the button's Message Handler.
double x1[]={1,2,3,4,5,6,7,8,9,0};
double x2[]={4,5,6,7,4,5,8,9,0,7};
double res[19];
mxArray* In1;
mxArray* In2;
mxArray* Out;
In1=mxCreateDoubleMatrix(1,10,mxREAL);
In2=mxCreateDoubleMatrix(1,10,mxREAL);
memcpy(mxGetPr(In1),x1,10*sizeof(double));
memcpy(mxGetPr(In2),x2,10*sizeof(double));
Out=mlfMyFunc(In1,In2);
memcpy(res,mxGetPr(Out),19*sizeof(double));
mxDestroyArray(Out);
mxDestroyArray(In1);
mxDestroyArray(In2);
Copy MyFunc.m into your VC++ project directory. Now go to the MatLab Add-in and click the .m++ (Add m-files to current project) button:

Select Windows Console Exe from the Combo Box and check Generate main file and debug mode. Press OK.
Then select the MyFunc.m file and click Open. After a while you will see new files added to your project.

Under MATLAB M-files you will see our MyFunc.m, you can even edit it from inside Visual C++. Under MATLAB C/C++ are MyFunc.c and MyFunc_main.c, generated by the MatLab Compiler. And all the headers needed by the compiler.
We can't build the app yet, we must add the following lines to convDlg.cpp:
#include "matlab.h"
#include "MyFunc.h"
Now the project should be built without any problem.
Points of Interest
The steps described here don't include the MSChart part, you can see it from the source code, but you can see that the calculation is done by placing a breakpoint inside the button message handler and checking the value of the res vector after the line: memcpy(res,mxGetPr(Out),19*sizeof(double));
Well I hope this simple article be interesting for MatLab lovers, this is the first article I wrote, so I apologize if it is not clear enough. I will be glad to explain anything if you ask me. Greetings.
| You must Sign In to use this message board. |
|
| | Msgs 1 to 25 of 115 (Total in Forum: 115) (Refresh) | FirstPrevNext |
|
|
 |
|
|
Hello Cambalindo Thank you for the perfect project and beautipfu explanation. Iwell compiled your project, but when I start it and when I press "CONV" button the Error box appears which is saying about "Invalid property value". How do I can reapare that ?
That message appears in WINCORE.CPP file in such place
CATCH_ALL(e) { CWinThread* pWinThread = AfxGetThread(); if ( pWinThread != NULL ) { lResult = pWinThread->ProcessWndProcException(e, &pThreadState->m_lastSentMsg); TRACE1("Warning: Uncaught exception in WindowProc (returning %ld).\n", lResult); } else { TRACE0("Warning: Uncaught exception in WindowProc.\n"); lResult = 0; } DELETE_EXCEPTION(e); }
when is executing this code part in CONV button function if(n<11) { m_Chart.SetColumn(1); m_Chart.SetRow(n+1); value=do2CStr(x1[n]); m_Chart.SetData(value);
m_Chart.SetColumn(2); m_Chart.SetRow(n+1); value=do2CStr(x2[n]); m_Chart.SetData(value);
}
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
Hi,vitamine, thanks for your words regarding the article. It's really annoying that it's not working for you, and unfortunately I don't have an answer for your error, could you tell me what Matlab and VS versions are you using? regards.
Daniel Cespedes
"There are 10 types of people, those who understand binary and those who do not" "Santa Cruz de la Sierra Paraiso Terrenal!"
daniel.cespedes@ieee.org
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
MATLAB version is 6.5 or VS according to the article - 6.0. I gess that problem is with visualisation, because in initialisation of graph window defined 10 points (input data), after convolition we get 16 points. In my opinion is something wrong with reinitialisation.
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
perhaps, you could try without the mschart, comment all the lines corresponding to the chart, and see if your function is working. If it works, the problem es in the chart part, I'll review it to see if I can find the error. cheers
Daniel Cespedes
"There are 10 types of people, those who understand binary and those who do not" "Santa Cruz de la Sierra Paraiso Terrenal!"
daniel.cespedes@ieee.org
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
Hi,
Could you give me idea on this errors? I am currently using Matlab 7.5.0(2007b) and Microsoft Visual c++ 6.
Please. thank alot.
c:\documents and settings\administrator\desktop\matlab_add_in\myfunc.h(21) : fatal error C1083: Cannot open include file: 'libmatlb.h': No such file or directory MyFunc_main.c c:\documents and settings\administrator\desktop\matlab_add_in\myfunc_main.c(14) : fatal error C1083: Cannot open include file: 'libmatlb.h': No such file or directory Error executing cl.exe. Build : warning : failed to (or don't know how to) build 'E:\trabajos\daniel\practicasC++\conv\MyFunc.m'
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
Hi, pls. see the thread right below this one, I think your errors are addressed there. another thing: the last warning, is addressing my HardDisk: Error executing cl.exe.
Build : warning : failed to (or don't know how to) build 'E:\trabajos\daniel\practicasC++\conv\MyFunc.m' check that should be your path to your function. regards
Daniel Cespedes
"There are 10 types of people, those who understand binary and those who do not" "Santa Cruz de la Sierra Paraiso Terrenal!"
daniel.cespedes@ieee.org
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
I had matlab 7.0 and the mccsavepath command doesn't work anymore, this is because this version of matlab supposedly 'automatically' adds its path to the windows path. this is not necessarily done right and can be corrected manually. See instructions here and add you matlab bin directory to the path, for example on my computer I copied this to my path: C:\Program Files\MATLAB\R2007a\bin C:\Program Files\MATLAB\R2007a\bin\win32
also, make sure your visual c++ bin directory is in the same path, on my computer: C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin
Before I discovered this I reinstalled an older version of matlab that did have a working mccsavepath command, matlab 6.5 (release 13). in matlab 6.5 I typed in the commands as this article shows and they worked ok, but then I still had to go into the windows path and manually make sure that the matlab and vc++ bin directories were in the windows path: c:\matlab6p5\bin\win32 C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
IN ADDITION:
some of you asked about mlfMyFunc undeclared identifier errors. The way to fix this is to open the myfunc.h file, and look to see what the corrrect capitalization is of the function, it should be around line 26 of the .h file. the capitalization seems to be arbitrary so make sure you check, for me it was mlfMyfunc() even though the .h file was myfunc.h and my m-file function was MyFunc()
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
here's how I finally got everything to work. read my advice in the two comments above (check capitalization of myfunc, include bin directories in the widnows PATH, etc.
%+++++++++++++++++++++++++++++++++++ %+++++++++--MATLAB M FILE--+++++++++ %+++++++++++++++++++++++++++++++++++ function out=MyFunc(a,b) if ( a >= b) out = a; else out = b; end %+++++++++++++++++++++++++++++++++++
//################################### //#########--VC++ Code Below--####### //###################################
//#######library modules linked to project:######### // libmwlapack.lib libmex.lib libmx.lib
//include section #include "stdafx.h" #include "MatlabIntegrationTest.h" #include "MatlabIntegrationTestDlg.h" #include "matlab.h" #include "myfunc.h" #include "mat.h" #include "conio.h" #include
/* this part below is in the OK buttons function I modified the code posted in the instructions to be simpler my code sends two numbers, x1 and x2 to the m-file, the m-file decides which number is larger and sends it back to the c++ code --- you can see the unmodified original code in the comments above each line of my modified code --- In order to see that the code was working correctly, I made an 'edit box' in my GUI dialog, the variable associated with the edit box is m_Output So at the end of my code I write the value returned to the c++ code from the m-file to the edit box so you can see it. In the case of the two numbers I'm sending the m-file in my code (4 and 6), it should show a 6 when you click the GUI's ok button to run the program. */
void CMatlabIntegrationTestDlg::OnOK() { //double x1[]={1,2,3,4,5,6,7,8,9,0}; //double x2[]={4,5,6,7,4,5,8,9,0,7}; double x1[]={6}; double x2[]={4}; //double res[19]; double res[1];
//create the arrays that will be passed to MyFunc
mxArray* In1; mxArray* In2; mxArray* Out;
//we make them Real and have 10 values //In1=mxCreateDoubleMatrix(1,10,mxREAL); //In2=mxCreateDoubleMatrix(1,10,mxREAL); In1=mxCreateDoubleMatrix(1,1,mxREAL); In2=mxCreateDoubleMatrix(1,1,mxREAL);
//this make In1=x1;In2=x2 //memcpy(mxGetPr(In1),x1,10*sizeof(double)); //memcpy(mxGetPr(In2),x2,10*sizeof(double)); memcpy(mxGetPr(In1),x1,1*sizeof(double)); memcpy(mxGetPr(In2),x2,1*sizeof(double));
//Call to MyFunc.m that return the convolution of In1 and In2
Out=mlfMyfunc(In1,In2);
//now we have the result(Out) in a double array 'res' //memcpy(res,mxGetPr(Out),19*sizeof(double)); memcpy(res,mxGetPr(Out),1*sizeof(double));
//send the returned value to an edit box of the GUI double LeeOut; LeeOut = res[0]; m_Output = LeeOut; UpdateData(FALSE);
//extra debug message MessageBox("hi");
//Destroy matrices mxDestroyArray(Out); mxDestroyArray(In1); mxDestroyArray(In2);
}
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
Thanks leevonk!! for clarifying some of the doubts posted, and making the sample easier to implement!! I haven't looked this article for a while... cheers!
Daniel Cespedes
"There are 10 types of people, those who understand binary and those who do not" "Santa Cruz de la Sierra Paraiso Terrenal!"
daniel.cespedes@ieee.org
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
I have the same exact proplem as the following and i have matlab R2007b :
I follow the instruction to Configure the Matlab Add-in for Visual Studio 6 to work within MSVisual C++: by Open MSVisualC++, Select Tools -> Customize from the MSVC menu. Clicking on the Add-ins and Macro Files tab. but i dont see any MATLAB for Visual Studio on the Add-ins or Macro Files list , i also type the command in MAATLAB: cd(prefdir) ; save mccpath;
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
sir, I used the example to build an Vc++6.0 application which use matlab function and yhe application run well. my problem is when i execute my application to the another computer i have some errors. how can i generate the executable file of my application?
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
Can you send me the error messages in the other computer you try to run.. does the other computer has VC++ insalled, if not you may be need some dlls to copy.
Daniel Cespedes
"There are 10 types of people, those who understand binary and those who do not" "Santa Cruz de la Sierra Paraiso Terrenal!"
daniel.cespedes@ieee.org
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
this is my first time to come here.I also have the problem that is same as Joel Karbassi .My matlab release is 7.1. I also cannot see the button in MSVC. I'm glad to hear from you and thank you!
|
| Sign In·View Thread·PermaLink | 1.50/5 (2 votes) |
|
|
|
 |
|
|
i follow the instruction to Configure the Matlab Add-in for Visual Studio 6 to work within MSVisual C++: by Open MSVisualC++, Select Tools -> Customize from the MSVC menu. Clicking on the Add-ins and Macro Files tab. but i dont see any MATLAB for Visual Studio on the Add-ins or Macro Files list , i also type the command in MAATLAB: cd(prefdir) ; save mccpath;
sincerely Joel
|
| Sign In·View Thread·PermaLink | 2.00/5 (1 vote) |
|
|
|
 |
|
|
what matlab version do you have?
Daniel Cespedes
"There are 10 types of people, those who understand binary and those who do not" "Santa Cruz de la Sierra Paraiso Terrenal!"
daniel.cespedes@ieee.org
|
| Sign In·View Thread·PermaLink | 2.00/5 (3 votes) |
|
|
|
 |
|
|
I'm new to MATLAB programming. I currently use MATLAB v6.1(R12) on MS WINXP SP2 with MS Visual C++ (6.0). I created a section of a program within the Visual C++ environment and inserted a function M-file into this program using the MATLAB Visual Studio Add-in. The function M-file is to produce graphical output based on the values of arrays which are to be initialized in the C++ environment. The resulting program shows no compile errors. The problem begins when the program is executed. It seems unable to use the arrays intialized within the Visual C++ environment and returns the error: "variable x is undefined". I don't understand why this is so as the arrays have been initialized and passed (mwArray(n_,_n,_name). I would appreciate it if someone could provide assistance urgently. Thank you
ATBU
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
I'm new to MATLAB programming. I currently use MATLAB v6.1(R12) on MS WINXP SP2 with MS Visual C++ (6.0). I created a section of a program within the Visual C++ environment and inserted a function M-file into this program using the MATLAB Visual Studio Add-in. The function M-file is to produce graphical output based on the values of arrays which are to be initialized in the C++ environment. The resulting program shows no compile errors. The problem begins when the program is executed. It seems unable to use the arrays intialized within the Visual C++ environment and returns the error: "variable x is undefined". I don't understand why this is so as the arrays have been initialized and passed (mwArray(n_,_n,_name). I would appreciate it if someone could provide assistance urgently. Thank you
ATBU
|
| Sign In·View Thread·PermaLink | 2.00/5 (1 vote) |
|
|
|
 |
|
|
On VS2003 I get mbuild -setup and mex- setup to work and can build mex files (from .c/.cpp code and .m code). I did this (in case anyone wants to know) by making a copy of the VC folder in the visual studio .net folder and naming it Vc7 (as this is where matlabs mbuild -setup script looks for the cl.exe compiler). I could also get the Visulal Studio. However the add-in, that should be made availeble after running the mbuild -setup, is not availeble because the tools-customize dialogue is not the same as in VC++ 6. Also the (copied) Vc7 folder is not accessed by VS2003 .net so, if this is where the add-in is placed it will not be found. To overcome this I used the MatLab VS.Net Custom App Wizard (see matlab exchange) to allow me to start a mex project using the VS IDE new project wizard. This was fine.
Now I have upgraded to VS2005 and things are not so good.
On VS2005 I can get the mex -setup and mbuild -setup scripts to run successfully (by doing the same copying and calling it trick) but this time the .dlls dont work. Also I have tried the MatLab VS.Net Custom App Wizard and although I can get the wizard to create the project, the project no longer compiles.
If anyone has sorted this out yet please let me know. Also, if your using VS2003 then try my trick of creating the Vc7 folder in the VS.NET2003 folder.
cheers,
lIAmO,
lets help each other make coding easier.
|
| Sign In·View Thread·PermaLink | 1.00/5 (1 vote) |
|
|
|
 |
|
|
Hi, my name is Ray, can I help you?
I have a function (piecewise) in matlab's editor
function y = fdp1(x)
if (x < 0) y=0; elseif (x >= 0 & x < 1) y=(1/2)*x.^2; elseif (x >= 1 & x < 2) y=1/2; elseif (x >= 2 & x < 4) y=(1/4)*x; else x >= 4 y=1; end;
______________ When I want to plot, It's don't plot Why?
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
Hola,en primer lugar te expreso mis saludos y agradecerte pues este tutorial e ha servido mucho.Ahora te quiero hacer una pregunta: lo que yo deseo es leer una funcion en visual c++ usando el add in pero en esta función yo guardo variables como archivos .mat para luego cargarlos con load en otra función y poder trabajar en esa. ¿Cómo puedo trabajar con estos archivos?.Te agradeceré mucho tu ayuda. Hector Villacorta
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
I want to write a Visual C++ program which gets data from the user and gives this data to GAMS (on a simple button click and GAMS should not run visibly). GAMS is then supposed to make a calculation and give the obtained data back to my Visual C++ program so that I can use this new data. Does anybody know if this is possible???? And if so, then how should I do this? THANKSA in advance.
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
Sorry but I don't know what GAMS is.. could you explain pls. tks.
Daniel Cespedes
"There are 10 types of people, those who understand binary and those who do not" "Santa Cruz de la Sierra Paraiso Terrenal!"
daniel.cespedes@ieee.org
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
GAMS (General Algebraic Modeling System ) is (I think) similar to matlab though the source code is only written in a text file and not in a .m file.
|
| Sign In·View Thread·PermaLink | 3.00/5 (1 vote) |
|
|
|
 |
|
|
hi, desparately in need of advise why it doesnt seem to work for me..
I did all the steps as advised and what i did was change the function and import to my vc++ program. I tried a simple .m file ie.
ie. function d=magic(imagefn) ie. p = imread(imagefn); ie. imshow(p); ---- where imagefn is a filename string However, when i tried calling the function mlfMagic(filename) in VC++, it keeps giving me error ' function does not take 1 parameters' when indeed my .m requires only an input parameter 'imagefn'. Can advise me immediately on this issue if u know the answer? Tks in advance!
|
| Sign In·View Thread·PermaLink | |
|
|
|
 |
|
|
General News Question Answer Joke Rant Admin
|