![]() |
General Programming »
Macros and Add-ins »
General
Intermediate
License: The Code Project Open License (CPOL)
Using MatLab Add-in for MS Visual Studio 6By CambalindoHow to Use the MatLab Add-in for MSVC++ 6 |
VC6Win2K, MFC, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||

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.
You need Visual Studio 6 and MatLab Release 12 installed with the MatLab C Library and Matlab Compiler.
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:
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.
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.
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
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.
//x1 and x2 are the input array to do the computation //res will have the result, we already know that the length //of the convolution of 2 vectors is (length(x1)+length(x2)-1)=19 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]; //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); //this make In1=x1;In2=x2 memcpy(mxGetPr(In1),x1,10*sizeof(double)); memcpy(mxGetPr(In2),x2,10*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)); //Destroy matrices 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.
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.
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 4 Jul 2003 Editor: Nishant Sivakumar |
Copyright 2003 by Cambalindo Everything else Copyright © CodeProject, 1999-2009 Web16 | Advertise on the Code Project |