There is a Matlab function (h5write) that lets the user write output files in hdf5 format. This seems to work nicely when using the Matlab environment and Matlab files. However, when I try to generate C++ code out of the Matlab files, a conversion error arises. It appears that the code generator (Matlab Coder) cannot convert the h5write operation into C++ code.
Is there any way of getting around this issue? Efficiency is also important here since the data sets that need to be stored by the generated C++ executable are fairly large. If anybody could help me out here, it would make my day! :-)
MATLAB currently provide an interface for converting the code for h5write into C++ code. That being said, you can use MATLAB compiler to build an executable or dll. You can use this in your C++ code, but you will always need the MCR. If space is not a constraint, you can do this.
Otherwise, you can use the HDF5 API (http://www.hdfgroup.org/HDF5/doc/cpplus_RM/) and write code for writing into HDF5 file format and then use MATLAB Coder to link and compile.
Related
My goal is getting the spectrogram result like this article in C++. They have example matlab source code and I want to port them into C/C++. Here are 3 matlab functions:
Blurring function
PLCA
STFT
I tried to use Matlab Coder to generate C code and get result like this:PLCA C
There were many problems with this converted code: it depends on many lib and functions, there was some methods can't be ported, and I can't build it.
So I decide to port code by hand, and then I faced with other problems:
The data type in matlab is very flexible, for example, the array in matlab can add more columns at anytime, it can contain other array or vector, so it make confuse how to convert it into C++
There were some supported methods/operations in matlab and I don't know how to port it into C++. For example, circshift, zeros, divide two matrixes ...
Is there any suggestion?
I've no experience on matlab coder but we solve this type of problems by using simulink code generator. It may seem weird but works fine. We create a simulink project and add a matlab function block, copy-paste the function there and start code generation.
And of course matlab don't want to show us the key points of their algorithms thats why there are libraries in this method as well.
I know it could souds as a very famous topic, but I didn't find anything that helps me with this.
This is the scenario:
I have a myFun.m function, no matter what's inside, it is a generic function which could potentially depends on other toolboxes. It has inputs and outputs;
I want to generate the analogous myFun.mex function;
I have Matlab Compiler and I can compile myFun.m as
mcc -v -W lib:libmyFun -T link:lib myFun
In this way I get some new files:
libmyfun.c
libmyfun.dll
libmyfun.exp
libmyfun.exports
libmyfun.h
libmyfun.lib
Reading around and following Loren's example I guess I have to create a myfun.cpp which inside includes the very famous gateway function:
/* The gateway function */
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
/* variable declarations here */
/* code here */
}
I've tried to do that and called the mex generation routine:
mex('-v', 'myfun.cpp')
but I get several errors, and I must say my myfun.cpp is copy/paste function where I have a lot of doubts on... especially on inputs/outputs management.
My question is... apart from the myfun.cpp function which could be full of errors as I'm not a C/C++ developer... is the process correct?
If the answer is YES, does anybody knows which is the generic way to write the myfun.cpp?
Cheers,
Sebastian
MATLAB Compiler does not do what you want.
MATLAB Compiler takes your .m code and encrypts and archives it into a .ctf (Component Technology File) file. It then produces a thin wrapper (either a .exe file, or a .dll library file along with files to enable calling the library from C). You deliver the .ctf file and the wrapper to your end user along with the freely redistributable MCR (MATLAB Compiler Runtime). It's possible to package either the first two or all three into a single unit for easier distribution.
The end user runs the executable or library, which dearchives and decrypts the .m code and runs it against the MCR rather than MATLAB. You can think of the MCR as basically a copy of MATLAB, but without the front-end desktop environment.
MATLAB Compiler is intended for the use case that you want to easily share a MATLAB application or algorithm with someone who does not have MATLAB. Because the code is encrypted, you can also use it to protect your intellectual property. But the code remains as .m code, and executes exactly as it would within MATLAB, including the same speed.
MEX is something different entirely. If you have an algorithm implemented in C code, you can add the 'gateway' routine you mention to it, and compile it with the command mex into a library that is then callable from MATLAB as if it were a regular MATLAB command or function. MEX functionality is part of regular MATLAB, and doesn't require any add-on products.
There is also another product, MATLAB Coder, that is distinct from MATLAB Compiler.
MATLAB Coder takes .m code that is in a subset of the MATLAB language, and converts it to C code. The subset is very extensive, but there are a few significant restrictions on the parts of the MATLAB language that are supported. I'm afraid those restrictions include many toolbox functions, including some functionality from Neural Networks Toolbox.
You can then do lots of things with that C code, including using MEX to compile it back into a form usable as a MATLAB command. This can often, though not always, provide a significant speedup over the original .m code. You can also do other things such as integrate the C code into a wider C project. or deliver it to an embedded device.
The main answer to your question is:
MATLAB Compiler doesn't do what you need.
To produce a MEX file file from your .m code, either recode it manually into C and then mex it, or use MATLAB Coder to automatically produce C code and then mex it.
I am writing a simulation of some differential equation. My idea was the following:
1. Write the core simulation (moving forward in time, takes a lot of time) in C++
2. Do initialisation and the analysis of the results with a program
like Matlab/Scilab
The reason for (1) is that C++ is faster if implemented correctly.
The reason for (2) is that for me it is easier to make analysis, like plotting etc..., with a program like Matlab.
Is it possible to do it like this, how do I call C++ from Matlab?
Or do you have some suggestions to do it in a different way?
You could certainly do as you suggest. But I suggest instead that you start by developing your entire solution in Matlab and only then, if its performance is genuinely holding your work back, consider translating key elements into C++. This will optimise the use of your time, possibly at the cost of your computer's time. But a computer is a modern donkey without a humane society to intervene when you flog it to death.
As you suggest, well written C++ can be expected to be faster than interpreted Matlab. But ask yourself What is Matlab written in ? For much of its computationally-intensive core functionality Matlab calls libraries written in C++ (or whatever). Your task would be not to write code faster than interpreted Matlab, but faster than C++ (or whatever) written by specialists urged on by a huge market of installed software.
Yes, Matlab has a C/C++ API.
This API permits to:
Write C++ functions which can be invoked from Matlab
Read/Write data from a .mat file
Invoke the Matlab engine from C++
I am working to something similar to what you are trying to do, my approach is:
Import in C++ the input data from a .mat file
Run the simulation
Export the results back in a .mat file
The Matlab API is in C, and I suggest you to write a C++ wrapper for your convenience.
In order to work with Matlab mxArray, I suggest to take a look at the boost::multi_array library.
In particular you can initialize an object of type multi_array_ref from a Matlab mxArray like this:
boost::multi_array_ref<double,2> vec ( mxGetPr (p), boost::extents[10][10], boost::fortran_storage_order() );
This approach made the code much more readable.
You can call your own C, C++, or Fortran subroutines from the MATLAB command line as if they were built-in functions. These programs, called binary MEX-files, are dynamically-linked subroutines that the MATLAB interpreter loads and executes.
You should set compiler, look here Setting up mex to use the Visual Studio 2010 compiler.
All about MEX-files here: http://www.mathworks.com/help/matlab/matlab_external/using-mex-files-to-call-c-c-and-fortran-programs.html.
I have written some mex (c++) code, i have used mxArrays, and few other Matlab functions, i am wondering is it possible to convert it to C++ code easily by including the appropriate header and making some minor changes ?
edit:
By "convert", i mean that i want to compile and run my code without relying (using) on matlab.
As mentioned in the comments above, making this work depends greatly on the nature of the MATLAB functions you are using. Since you have successfully ported much of your MATLAB code to C++, I suggest you continue doing so until you are no longer reliant on the MATLAB libraries to build.
Are there any toolbox functions you are relying on? If so this may be a bigger task than you realize.
Good luck!
You can make executable by using SimulinkCoder - so you can run it without Matlab ... but you still must use Matlab to make executable every time you make change in the code.
Make basic Simulink model with single S-function block in which you specify your mex file.
Use SimulinkCoder (Real Time Workshop) to make executable out of the Simulink model.
I am working on an image processing project using Matlab. We should run our program (intended to be an application) on a cell phone.We were then asked to convert our code into C or C++ language so we get a feel of how long it would take for execution and then choose a platform. So far we didn't figure out how to do this conversion.. Any ideas of what to do to convert Matlab to C or C++??
The first thing you need to realise is that porting code from one language to another (especially languages as different as Matlab and C++) is generally non-trivial and time-consuming. You need to know both languages well, and you need to have similar facilities available in both. In the case of Matlab and C++, Matlab gives you a lot of stuff that you just won't have available in C++ without using libraries. So the first thing to do is identify which libraries you're going to need to use in C++. (You can write some of the stuff yourself, but you'll be there a long time if you write all of it yourself.)
If you're doing image processing, I highly recommend looking into something like ITK at http://www.itk.org -- I've written my image processing software twice in C++, once without ITK (coding everything myself) and once with, and the version that used ITK was finished faster, performed better and was ten times more fun to work on. FWIW.
Matlab can gererate C code for you.
See:
http://www.mathworks.com/products/featured/embeddedmatlab/
The generated code does however depend on matlab libraries. So you probably can't use it for a cell phone. But it might save you some time anyways.
I also used the MATLAB Coder to convert some functions consisting of a few hundred lines of MATLAB into C. This included using MATLAB's eigenvalue solver and matrix inversion functions.
Although Coder was able to produce C code (which theoretically was identical), it was very convoluted, bloated, impossible to decipher, and appeared to be extremely inefficient. It literally created about 10x as many lines of code as it should have needed. I ended up converting it all by hand so that I would actually be able to comprehend the C code later and make further changes/updates. This task however, can be very tedious/dangerous, as the array indexing in Matlab is 1-based and in C it's 0-based. You're likely to add bugs into the code, as I experienced. you'll also have to convert any vector/matrix arithmetic into loops that handle scalars (or use some type of C matrix algebra package)
The MathWorks provides a product called MATLAB Coder that claims to generate "readable and portable C and C++ code from MATLABĀ® code". I haven't tried it myself, so I can't comment on how well it accomplishes these goals.
With regard to the Image Processing Toolbox, this list (presumably for R2016b) shows which functions have been enabled for code generation and any limitations they may have.
Matlab has a tool called "Matlab Coder" which can convert your matlab file to C code or mex file. My code is relatively simple so it works fine. Speed up gain is about 10 times faster. This saves me time coding a few hundreds lines. Hope it's helpful for you too
Quick Start Guide for MATLAB Coder Confirmation
The links describe the process of converting your code in 3 major steps:
First you need to make a few simplifications in your present code so that it would be simple enough for the Coder to translate.
Second, you will use the tool to generate a mex file and test if everything is actually working.
Finally you would change some setting and generate the C code. In my case, the C code has about 700 lines including all the original matlab code (about 150 lines) as comments. I think it's quite readable and could be improve upon. However, I already get a 10 times speed up gain from the mex file anyway. So this is definitely a good thing.
We can't not be sure that this will work in all case but it's definitely worth trying.
I remember there is a tool to export m-files as c(++)-files. But I could never get that running. You need to add some obscure MATLAB-headers in the c/c++code, ... And I think it is also not recommended.
If you have running MATLAB-code, it shouldn't take too much effort to do the conversion "by hand". I have been working on several project where MATLAB was used and it was never consider to use any tools to convert the code to C/C++. It was always done "by hand".
I believe to have been the only one who ever investigate into using a tool.
Well there is not straight conversion from matlab to c/c++ You will need to understand the language and the differences between matlab and c/c++ and then start coding it in c/c++. Code a little test a little until it works.