
Comments and Discussions



I'm running Visual Studio 8 and Matlab 7, now I've changed matlab.h to matrix.h, which allows it to compile properly, however when it tries to build it can't open "libmatlb.lib". As I understand it MatLab 7 doesn't require libmatlb.lib or libmmfile.lib, but when I take out the code that tries calling them I get 8 more build errors:
Matlab to C++.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall CMatlabEng::~CMatlabEng(void)" (??1CMatlabEng@@UAE@XZ)
Matlab to C++.obj : error LNK2001: unresolved external symbol "public: int __thiscall CMatlabEng::Close(void)" (?Close@CMatlabEng@@QAEHXZ)
Matlab to C++.obj : error LNK2001: unresolved external symbol "public: int __thiscall CMatlabEng::EvalString(char const *)" (?EvalString@CMatlabEng@@QAEHPBD@Z)
Matlab to C++.obj : error LNK2001: unresolved external symbol "public: int __thiscall CMatlabEng::PutVariable(char const *,struct mxArray_tag const *)" (?PutVariable@CMatlabEng@@QAEHPBDPBUmxArray_tag@@@Z)
Matlab to C++.obj : error LNK2001: unresolved external symbol "public: int __thiscall CMatlabEng::SetVisible(bool)" (?SetVisible@CMatlabEng@@QAEH_N@Z)
Matlab to C++.obj : error LNK2001: unresolved external symbol "public: void __thiscall CMatlabEng::Open(char const *)" (?Open@CMatlabEng@@QAEXPBD@Z)
Matlab to C++.obj : error LNK2001: unresolved external symbol "public: __thiscall CMatlabEng::CMatlabEng(void)" (??0CMatlabEng@@QAE@XZ)
Debug/Matlab to C++.exe : fatal error LNK1120: 7 unresolved externals
Error executing link.exe.
Any ideas on how to get over this obstacle?
thanks for your time
TNT





I have exactly the same problem, if you already fixed it, please let me know.
thanks,
gvallemoura





hi, i have read the article about how to use matlab syntax in c++, but i cant understand it(maybe its because my english is not good enough).
actually, i want to do singular value decomposition(svd) function from matlab to my c++ project because i dont want to waste time to make the function myself..(actually i need some functions, not only svd)
anyone can tell me step by step how to use/connect matlab in c++?
u can send me an email to rifsolution@yahoo.com
please help me..
thanx..
btw, i use matlab 5.3, msvc++ 6.0, windows vista





Dir Sir,
I use Microsoft Visual Studio.NET, Matlab 6.5. I tried to use header flie "engine.h", but I meet the below problem:
This is my code:

#include
#include
#include "engine.h"
void main()
{
Engine* ep;
ep = engOpen(NULL); // Connect to MATLAB engine

When I build project, I have the error:
error LNK2019: unresolved external symbol engOpen referenced in function_main
I look forward to hearing from you.
Thanks you so much.
Best regards,





Hi,
I have tried to run this code in visual studio 2005. I have changed Matlab.h to matrix.h, removed the unnecessary libs and the program compiles without error. However, at runtime I get an unhandled exception and a crash in gs_support.c in the lines listed below
#else /* defined (_WIN64) */
cookie = systime.ft_struct.dwLowDateTime;
cookie ^= systime.ft_struct.dwHighDateTime;
#endif /* defined (_WIN64) */
Please find error log below
'MatlabClass.exe': Loaded 'C:\Documents and Settings\mdp28\Desktop\MatlabEng_demo\Debug\MatlabClass.exe', Symbols loaded.
'MatlabClass.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', No symbols loaded.
'MatlabClass.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', No symbols loaded.
Firstchance exception at 0x000a4ad6 in MatlabClass.exe: 0xC0000005: Access violation reading location 0x000a4ad6.
Unhandled exception at 0x000a4ad6 in MatlabClass.exe: 0xC0000005: Access violation reading location 0x000a4ad6.
The program '[3800] MatlabClass.exe: Native' has exited with code 0 (0x0).
Regards
Michael





Hi,
at first thanks for writing CMatlabEng.
I want to use an instance 'm_matlab' of CMatlabEng as a member in another class.
I wanted to open the Instance in the constructor (m_matlab.Open(NULL);) and close it in destructor. I found out that it only works when Opening 'm_matlab' in the same method where I want to use it.
Do you have some idea what´s the reason for this?
thanks in advance Jower
jower





Hello!
Sounds familiar ... It seems the matlab engine can only be used within the same thread it's been initialized in. If your constructor is called within thread A and your actual data processing is done in another thread B, it won't work. (Check "GetCurrentThreadId()")
Its no solution but that's what I've figured out by now.
Best regards
Sven





I am using the MATLAB v7.0.0(R14)and changed "Matlab.h" to "Matrix.h".
But, when I have complied the "MatlabClass", I got the error message "cannot open file "libeng.lib" ".
Do I have to set the full path of "libeng.lib" in the "pragma comment(lib,HERE)"?
If it is right, please let me know where libeng.lib is.
Also, I couldn't find both "libmatlb.lib" and "libmmfile.lib" in the whole matlab folder.
thank you
best regards,





Maybe you didn't install MATLAB Compiler Toolbox.
A. Riazi





You don't need libmatlb.lib or libmmfile.lib anymore for Matlab 7.0, so get rid of those. I don't know how to help you with libeng.lib, though.
Good luck.





How do you get the values from the pointer? (I'm new at C++.)
I do this:
mxArray *myP;
myP = mxCreateDoubleMatrix(1, 1, mxREAL);
int inMyP[1][1];
memcpy((void*) mxGetPr(myP), (void*) inMyP, sizeof(inMyP));
matlab.PutVariable("myP", myP);
matlab.EvalString("myP=1;");
myP = matlab.GetVariable("myP");
cout << myP << endl;
But myP isn't 1.
Thanks.





You created a double matrix: mxCreateDoubleMatrix(....)
but declared an integer array: int inMyP[1][1];
change this line to double inMyP[1][1];
Best regards,
A. Riazi





Yay! I got it to work. This is the code, slightly modified from above. The way to fix it is to use the memcpy function, but flip the variables.
mxArray *myP = NULL;
myP = mxCreateDoubleMatrix(1, 1, mxREAL);
double inMyP[1][1];
//matlab.PutVariable("myP", myP); //Don't need.
matlab.EvalString("myP = 1");
myP = matlab.GetVariable("myP");
memcpy((void*) inMyP, (void*) mxGetPr(myP), sizeof(inMyP)); //This was the fix, notice that the variables are changed around.
cout << inMyP[0][0] << endl;
cout << endl;
mxDestroyArray(myP);
Thanks a bunch for your help.
 modified at 16:09 Wednesday 10th January, 2007





myP is a pointer to mxArray structure. Then by using
cout << myP << endl;
you will see address of pointer. For printing the content of the matrix, use mlfPrintMatrix() function.
Here is the code:
mxArray *A;
A=mxCreateDoubleMatrix(3, 3, mxREAL);
memcpy(mxGetPr(A), (void *) imMyP, 3 * 3 * sizeof(double));
mlfPrintMatrix(A);
For more info, please see my other article: Solving Engineering Problems Using MATLAB C API[^]
Best regards,
A. Riazi





Great! I might use this in the future for dealing with larger arrays.
Clement





I'm currently using MATLAB version 7.3.0.267(R2006b)
 modified at 14:58 Friday 1st December, 2006





You may change matlab.h to matrix.h, and it works. Good luck!
Prgramming





In fact, neither "matlab.h" nor "matrix.h" is needed to run this demo in Matlab 7.0! Also, "libmatlb.lib" and "libmmfile.lib" should be removed.





Plz email me if you could find the answer also
I find the following error
#include"engine.h" not found





Dear Riazi,
I'm currently building a C++ project and hoping to use the MATLAB ploting function to show the results. I already loaded your code into the project folder but there seems to be a runtime error, for example, "...undefined reference to CMatlabEng::CMatlabEng()..." I think my problem is how to intergrate/compile your code with mine. In other words, I don't know how to put your code into my makefile.
Please, Riazi, if you have any suggestion or know of any way to make this work, please help.
Thank you very much.
Nik.





As I know, MATLAB Engin API only works under windows. Because the API uses Automation (ActiveX) technology.
Best regards,
A. Riazi





can you tell me how to embed the matlab figure into winform,like list control?
i use microsoft vc#2003 and matlab r2006a.
thank you very much.
tom





Hi, I need call some functions of the Intel Library OpenCV from matlab.I'm doing a project with matlab about image processing. My project director told me that there was a direct form for call this Intel library but now it's not possible.then, I'm thinking do it by a MEXfiles and need help!!!
How can I do it?
Thank you very much!!!!
Pedro Fernandez.





There are two ways:
1 Writing your own MEX files.
2 Create an ActiveX control containing the OpenCV codes then using the control inside your mfiles.
Best regards,
A. Riazi





Hi Mr. Riazi,
I want to use your program, I add the lib like that?
#pragma comment(lib, "C:\MATLAB701\extern\lib\win32\lcc\libeng.lib")
#pragma comment(lib, "C:\MATLAB701\extern\lib\win32\lcc\libmx.lib")
#pragma comment(lib, "C:\MATLAB701\extern\lib\win32\lcc\libmatlb.lib")
#pragma comment(lib, "C:\MATLAB701\extern\lib\win32\lcc\libmat.lib")
#pragma comment(lib, "C:\MATLAB701\extern\lib\win32\lcc\libmmfile.lib")
cause my matlab lib are in C:\MATLAB701\extern\lib\win32\lcc.
but I got this error while I compiled the project:
Compiling...
MatlabClass.cpp
c:\testmatlab\eng_demo\matlabclass.cpp(4) : fatal error C1083: Cannot open precompiled header file: 'Debug/MatlabClass.pch': No such file or directory
Error executing cl.exe.
MatlabClass.obj  1 error(s), 0 warning(s)
Your commnets and help is highly appreciated.
Best,
Reza





Salam
The error is because of the precompiled header file (*.pch). Try to clean your build and compile the project again.
Best regards,
A. Riazi





Hi
I read your article about MATLAB.
I, like Steven Romme, would also like to know if this can be used on a simulink model?
I have a simulink model of an aircraft dynamics and would like to extract variables from the simulink model using C++ and feed them into Microsoft Flight Simulator so that the aircraft within the flight sim behaves like a real aircraft.
Passing the data to Microsoft Flight Simulator is the easy part, however getting the variables into my C++ program is what I'm not sure about....
Any advice would be much appreciated.
Thanks, Marc





Hi,
I haven't worked with Simulink yet but I know that there is a solution. I think you can use Realtime workshop toolbox to link Simulink models to your VC++ apps.
Best regards,
A. Riazi





I have succesfully run you demonstration program under Matlab 6.5.0, but have now been upgraded to 7.0.4 (R14 service pack 2), which casues missing header errors. In a previous message, you mentioned that matlab.h needed to be replaced with mclmcr.h for the files to run under Matlab 7. However, neither file exists in my current version. Do you know if the headers been changed yet again, and what is needed now?
Thanks,
James





In fact, neither "matlab.h" nor "matrix.h" is needed to run this demo in Matlab 7.0! Also, "libmatlb.lib" and "libmmfile.lib" should be removed.
Good luck.
Zhang





Hi,
I read your article with great interest and i was wondering if this works with a simulink model as well.
We want to use a control system diagram designed in simulink in a standalone VC++ (MS studio 6 or .NET 2005)
This system has several inputs and outputs and a lot of parameters. What we want to do is create a VC++ program that receives the input from another module over a UDP communication and sends the output back to this module over UDP.
Is it possible to use this simulink model in your suggested way as .m files or .mex files work?
Thank in advance for your reaction!
steven.romme@gmail.com
Steven Romme
 modified at 18:15 Wednesday 22nd March, 2006





Hi,
I sent an email. Sorry that I couldn't reply you soon because I'm in trip. Here is Nowrouz (New days) that are first days of Iranian year.
Best regards,
A. Riazi





Hi,
Thanks firstly for your article and the demos, I found it quite useful!
The problem that I am having currently is to do with calling my own functions in matlab, for example:
I have made a Mfile in matlab called "times_two.m" and inside:
function y = times_two(x)
y = 2*x;
and now I have got your Matlab Engine code working inside my VC++ already, HOWEVER the problems occurs when I tried doing this:
//assume I have all the libraries included
int main(int argc, char* argv[])
{
CMatlabEng matlab;
matlab.Open(NULL);
matlab.EvalString("D = 100;"); // this will work
/* the fellowing will execute BUT does not return the right value */
matlab.EvalString("D = times_two(100);");
mxArray myVal = matlab.GetVariable("D");
// now I use my own print out function
myPrintingFunction(myVal);
matlab.Close();
return 0;
}
Now you would EXPECT the print out of the result will be 200, however it will just print 100 and I have tried many values on it and finally i have track down to the line:
matlab.EvalString("D = times_two(100);");
It seems as if it does not return the value to my variable "D", is it because Matlab Engine do not support userdefined functions or Mfiles? I am pretty sure that the function have been executed, just that it does not return the value...
(I am using Matlab 7 R14  the latest release)
Does anyone have a solution to this??
Thx in advance!!





Did you put your mfile in MATLAB path?
Best regards,
A. Riazi





I had the same problem. However, the matlab console has to be visible otherwise whether the output could be captured nor the result is calculated.





I have compiled and linked engdemo.c in MSVC++ 6.0. It gives 0 errors and 0 warnings. But when executed (please see the code below) only "Hi 1" is getting printed and it just waits. Nothing happens. engOpen(NULL) is not able to connect to MATLAB. Why this is happening.
printf("Hi 1\n");
if (!(ep = engOpen(NULL))) {
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
printf("Hi 2\n");
Then i tried going to start>Run and typing C:\matlab7\bin\win32\matlab.exe /Automation. It opens MATLAB command window only. After that if i run the engdemo.c it works ans shows the desired result.
Is it not possible to start the MATLAB without doing the /Automation business.
Thanx in advance
Sunil





You used MATLAB 7 but the code that I provided was for MATLAB 6.5. Maybe the interface of MATLAB changed a bit.
The engOpen() runs the MATLAB in background. You can do this manually or in application (by using ShellExecute ).
Best regards,
A. Riazi





Dear Sir,
Thank you for the reply. But it didn't solve my problem. engOpen(NULL) should run the MATLAB in backgroud, but it is not happening to me. I am using MATLAB 7 and Win2K. Please see the code below.
int main()
{
Engine *ep;
if (!(ep = engOpen(NULL)))
{
fprintf(stderr, "\nCan't start MATLAB engine\n");
exit(0);
}
engEvalString(ep, "edit");
engClose(ep);
return 0;
}
This code gives 0 errors and 0 warnings using MSVC++6.0. But when run it doesn't open editor. Why is this so?
It will be gr8 if you can let me know what mistake am i doing, and why the above code is not running.





Your code is correct. As I said maybe the MATLAB interface changed a bit. You know that by using engOpen() you want to use MATLAB COM interface (Automation) to load the MATLAB IDE.
The code that I provide was for MATLAB 6.5 and you want to load MATLAB 7.
Best regards,
A. Riazi





Hello,
I had a BC++ application that invoked the matlab engine using engOpen. It worked perfectly with R13 version of Matlab. With R14, even though I included the new libs, I get the following strange behavior. It still opens the Matlab engine but closes it thereafter. If I use engOpenSingleUse then I get return code of 3. I am not sure what this code means.
Did someone else face this problem with R14 and if yes! how was it resolved.
Thanks,
Pwn





Hi there,
Firstly i would like to say that is a very good article.Congratulations for that.
Now i would come to my problem.I need to call my own function finddepth(w1,w2).m where w1 and w2 are [5][3] matrices , from C.I want to send the matrices w1 and w2 from c to matlab.The function finddepth should process these values and send the result which is an integer back to the C compiler where I would like to print the results.
I have placed the finddepth.m in the work directory of the matlab but i dont have any idea if its running or not as the C rogram doesnt give me any error even if i m putting a wrong name over there.How shall i run my own file?
How to get the result back from the Matlab to the C program and how to print the result?
If possible can you show me a program module with the above application?
I shall be obliged for your help
Stefan





First to find MATLAB runs your mfile or not, you can use OutputBuffer() function to redirect any messages from MATLAB to a user defined buffer.
Second, for getting result of your mfile (in this case a matrix or scalar), use GetVariable() function. This will give you a mxArray pointer. You can use helper functions to print it.
Best regards,
A. Riazi





sir ,
i have some trouble about this, but i already add Matlab headers directory to VStudio directory.when i start to link your demo program, it show up the error message:
"LINK : fatal error LNK1104: cannot open file "libeng.lib"
my develop environment is
Visual C++ 6.0
Matlab 6.5 realese 13
Any help you can give me would be great.
Thanks.





You must also add the library folder to VStudio directory.
Best regards,
A. Riazi






There are library files for MSVC, Borland C++ Builder and WATCOM. You must add the MSVC library file to VStudio.
Best regards,
A. Riazi





How and where do we add the MSVC lib files?





Hello Mr. Riazi,
I read your article with interest.
I am using Compaq Visual Fortran6.6. I have Matlab6 installed in my computer with the operating system being Windows2000. Recently I also installed Matlab 7.1, so I have both Matlab6 and Matlab7.1. Previously I could easily execute this type of hybrid code:
program matplot
integer engOpen,engEvalString, engClose,ep
!DEC$ATTRIBUTES DLLIMPORT :: LIBENG
ep = engOpen('matlab ')
if (ep .eq. 0) then
write(6,*) 'Can''t start MATLAB engine'
stop
endif
call engEvalString(ep, 'cd c:\matplot')
call engEvalString(ep, 'plotmor');
end program matplot
I have included the lib libeng.lib in the resource area, the path being:
C:\Program Files\MATLAB71\extern\lib\win32\digital\df60\libeng.lib
Now I always get the message 'Can''t start MATLAB engine'
For libeng.lib I went back to Matlab6, but that does not work also. I am sure if I remove Matlab71 from the computer it will work again. But I do not like that. I like to keep both versions of Matlab and be able to invoke Matlab from my visual fortran routine.
Looking for a work around.
Thanks
Dilip





Dear all,
I have a problem with the MATLAB engine. I ask a MATLAB engine to evaluate a .m function. When the .m function is running I want to transfer matrix data to the MATLAB engine's workplace. This is because I receive data during certain events. The .m function can then read the new data and act
accordingly.
But unfortunately MATLAB does not work in this way. If an .m function is running, MATLAB does not put any new data in the workspace. I receive the matrix data only after the .m function has terminated.
Does anybody have a solution to this problem? I considered making an outofprocess COM server, so that I could call from inside my .m function to collect event data. This is a not so nice principle. Firstly, it is not event driven anymore. Secondly, I am writing a DLL, which calls my MATLAB engine. To write a outofprocess COM server in a DLL is a lot harder than writing it in an executable.
I hope somebody has some suggestions.
Kind regards,
Marcel Dijkstra





the weblink
http://www.mathworks.com/support/solutions/data/118CBI.html?118CBI
does help a bit.
But I want to do some simple plot in C/C++ using matlab 'plot' function.
saying changing the foo.m into test_plot.m
% test_plot.m
function y= test_plot(x)
x=1:10;
y=plot(x)
I can managed to compile and produce a test_plot.exe successfully. But upon execution of test_plot.exe in Command Prompt, it says:
ERROR: Function 'plot' requires the C/C++ Graphics Library.
EXITING.
I tried using a lower version of matlab 6.1, with Graphics Library, but it gives the same error.
I am reluctant to use Matlab 7, and compile, and create the MCR, because it is not suitable for me, and I just need to add in the plotting function into my existing C/C++ code. Dealing with MCR would make things more messy.
Or,
seem to me that another better option is to use the MATLAB Builder for COM, which I have not explored before.
any useful inputs is fully appreciated.
thanks.
Sincerely,
Thiam Huat







General News Suggestion Question Bug Answer Joke Rant Admin Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

