MATLAB compiler - preserving source code - matlab

I have a question about Matlab compiler, which I am very new to.
I am trying to compile a large Matlab program to a standalone unix application. It has a number of supporting directories (filled with .m files) which run algorithms on input data. One of the key uses of this program is in allowing users to add their own .m files with their own algorithms for the program to run.
I am able to compile the project and run it as a standalone without issue. But the user can no longer access and add supporting files once it had been compiled.
Has anyone ever come across this before and have any suggestions for dealing with it? I understand that the .m files need to be compiled to .exe and such, but I was hoping Matlab might have a workaround for keeping supporting files in their original state.

This behaviour is by design, and you can't get round it - in fact it's not only technically impossible, it's against the license agreement:
5.2.3. Licensee's Application may not provide scripting capability
similar to the capabilities of any of the Programs or provide
functionality or behavior similar to that of the MATLAB command
line.
Imagine if you created an application that simply accepted user input and passed it into the function eval. If you compiled it, you would then be able to essentially give away free copies of the whole of MATLAB to anyone.

Related

User-defined configurations for Matlab Compiled Projects

I am using the Matlab Compiler to compile Matlab code into dlls, which I can run elsewhere. However, my dlls and functions have a lot configuration variables and too many for them all to be an input to the function.
Currently, the user specifies a file path to a .mat file which is loaded within the compiled code for all the configuration settings. A .m file is executed to generate the .mat file. However, when the config settings change, the user must go into the .m file change the necessary settings and re-execute it to generate an updated .mat file.
Obviously, this process is cumbersome and it's easy to forget to re-execute the .m for the config to be updated. A couple things I have considered but seem problematic:
It'd be great if .mat files could be read/editted with text editor, but as far as I can tell this is not possible
Another approach is XML, but I am under the impression Matlab does not have great XML support
Run the .m file to populate the work-space within the compiled dll but this is not possible
So my question is if anyone else has run into this issue before or can think of any other alternative approaches that would be more streamlined than my current approach.
Thanks for reading!
So you could use XML - MATLAB does have support for XML via xmlread and xmlwrite. These functions return/accept a DOM node which you will need to manipulate yourself, though, and that can be a bit fiddly. XML is also not that fun for your users to have to edit or read if they want to change the config.
If you weren't using MATLAB Compiler, you could also use a .m file directly to store config information. But if you're compiling that won't work as the .m file will be encrypted and no longer editable.
I typically use YAML for config files. YAML is a text-based format, so the user will be able to edit them by hand in a text editor and you'll be able to version-control the files; but it's much more human-readable than XML. There are no angle-brackets, it's laid out much more simply, and you can include comments to delimit and explain sections of the config.
MATLAB does not natively support YAML, but there are third-party things that you can download (for example here or here) that work well, are easy to integrate, and are freely licensed. I've also written code myself that I'd be happy to share somehow if you need that.

Why can't I debug into UnityEngine.UI code?

I add the UnityEngine.UI.dll and UnityEditor.UI.dll to my assets folder with their mdb files . also i add the both project to my current project. i am sure all the unity engine ugui code build success, because i debug log in the event system, and it print message. when i want to step into the event system class, i always failed . I find unity will load the code from a build path ,rather than i original code. Why does it do this ? if i want to debug unity engine ugui code, what should i do ?
To debug code, you need two things:
Symbols, the list of all functions, classes, variables used throughout the module. When using C++ symbols are stored in special .pdb files on Windows (and you obviously are using Windows since you are talking about dlls). Symbols in C# (.NET in general) are stored in the .dll itself. Having symbols will let you see the name of functions on the call stack and possibly some variables but nothing more.
Source code of the module.
U3D's source code is proprietary - you need to spend a good amount of money to receive it. And if I am guess to - UnityEngine.UI.dll is a C++ module with stripped (removed) symbols removed.
Thus you have neither, so you can't debug U3D's code at all.
Why would you need to that anyway? If you want to see how the internals of a big game engine work, there are plenty of other options (for example UE4 and Lumberyard). If you are struggling with a problem and you'd like to be able to solve it through debugging...well though luck. Your best bet would be to ask in unity community.

MATLAB Compiler Runtime - how to run it?

I'm supposed to install the MATLAB compiler runtime for class purposes in one of my subjects at University. I have installed it and followed the guide - and this is my silly question: How do I run it? I mean, shouldn't there be some sort of icon or file I need to click to run the actual program?
It shows up on my list of installed programs (under controlpanel -> programs and features), and I have checked the folders where i installed it, but there doesn't seem to be any file or anything I can use to actually run it.
Maybe I misunderstood the purpose of MCR, but any help would be greatly appreciated.
Also, note that I am still new to anything computer-related that is more advanced than basic HTML and opening zipped files.
This question was already correctly answered in the comments by #seb, but to make sure it does not remain open I will post the answer here:
You need to write Matlab code and generate a .dll (or executable
maybe). Then this .dll can be run on a PC that has either Matlab or
MCR installed. But you don't click and start MCR.
And in addition to that I have added a description of how I see the MCR:
Think of the MCR as a bundle of complicated functions. When you compile a program you will just have the references to those functions in your program. Most of the content will actually be drawn from the MCR when your program is run.
That being said, if you actually want students to work with matlab (not just with programs pre built by the teacher) you will actually need to install Matlab, and not the MCR.

Using a build system for reproducible research?

I am doing a research project that involves a pipeline of programs, each generating an output file that becomes the input for the next program. I would like to make it easy to repeat the series of commands that I used to create the desired output. It seems like make or any other build system would be a good fit for this task, but all the build systems that I've looked at (except for maybe make itself) seem to be strongly biased toward building executabe files from source code, and I can't figure out how to do anything else with them. Does anyone have experience using a build system for tasks other than compiling source code into executables? Can I easily use a build system to facilitate reproducible research, or should I be looking for a different kind of tool?
Well, I figured this out by myself eventually. I'm using plain old (GNU) Makefiles.

Creating a standalone app from Matlab code

I have some Matlab code and a GUI for it and I want to make a standalone .exe so that it can be used on computers that don't have Matlab installed.
I know about the Matlab compiler and how to use it, but that creates an .exe that only works if the user has the MATLAB Compiler Run-Time (MCR) installed.
What I'm interested in, is if there are any ways to create a standalone .exe that still uses the Matlab code but does not depend on the MCR. I want it to just run when you click it without needing anything else installed.
I know C can make use of Matlab, is there any way to use the code with C? How about any open source Matlab alternatives that can it?
As a last resort, if I were to rewrite the Matlab code in another language, what language would you recommend? I was thinking C or Python.
Thanks.
It's been a while since I looked at the MATLAB compiler but if I remember correctly it used to be able to generate C/C++ code rather than going all-out and generating an executable. The hangup was always in which toolboxes your code used and whether the compiler supported them or not. Any chance you could install the MATLAB application on a server and have a desktop client phone in for results?
As far as other languages go, I'd check out NumPy and SciPy in combination with matplotlib (matplotlib.sf.net). I'm working with a MATLAB developer right now and so far he's pretty pleased with the experience.
The MCR is required, but there's a trick: it doesn't actually have to be installed, just available on the PATH. Running MCR stuff doesn't require any registry entries or anything else special from the installation process. You just need the MCR files readable and the DLLs locatable by the normal lookup mechanism, which includes checking the PATH at the time of program launch.
For example, I've run compiled Matlab apps using an MCR that's "installed" on a network drive. You run the MCR installer on one machine and have it install to network drive X:\Matlab\MCR\R2010b-win32 instead of the usual C:\Program Files location. Then have your program be launched through a wrapper script that adds X:\Matlab\MCR\R2010b-win32\bin\win32 to the PATH before calling your actual .exe file, and it'll run on any other machine that sees the same drive, even if the MCR installer hasn't been run on them. (Eventually we stopped because loading the MCR from the network is a performance hit.)
You could use this trick to bundle the MCR with your application. Stick the whole MCR installation (the dir tree resulting from installation, not the installer program itself) in a subdirectory of your application's directory tree, and have the entry point to your app be a .bat file or other wrapper script that sticks that MCR dir on the PATH before running your MCR-dependent .exe file.
Of course, check with your legal folks to make sure this doesn't violate your licensing terms.
MathWorks recently introduced a new product MATLAB Coder. It is capable of generating C\C++ code from your MATLAB code (generates source code not executables). The generated code is portable and does not depend on the MCR, though it only supports a subset of core MATLAB language features.
I have researched a bit, and I am afraid that your only option is either using the MCR, or converting your code into another language. It makes sense that MathWorks would want you to use only their compiler in order to create .exe files.
Consider another language only if you are already familiar with them, and/or you have enough time for what you are trying to accomplish. Furthermore, if you are using functions in Matlab that you didn't write, then you will have to write those also, which may be very hard/impossible.
If none of the above is a problem, then what language you should use is really up to you. You are not just limited to C and Python. Matlab, im my opinion, is very much like other common languages, at least in terms of syntax. You will have to do some learning either way, so I would suggest that you either go with a language you know, or pick a language for which finding help is easy. C# and Java are two of the more 'famous' languages.
The Matlab 'compiler' is not a compiler. It translates Matlab m-code into C++ code and then sends that to an actual compiler like the one in Visual Studio, etc. The code it makes is not really human-readable.
To make a standalone app, install the following toolboxes (at whatever price you paid):
MATLAB Builder JA, MATLAB Builder NE, MATLAB Compiler
Set up the Matlab compiler by pointing it to the actual compiler on your drive (i.e. mbuild -setup).
Select a compiler:
[1] Microsoft Visual C++ 2008 SP1 in C:\Program Files (x86)\Microsoft Visual Studio 9.0
Then use the (i.e. type deploytool) to make the main and to define various helper functions etc. Sect windows console or standalone. Then click build. It will make the exe-file for you. You can also compile to DLL, etc as needed.
Newer versions of the 'compiler' support compiling of eval, all toolboxes that are licensed, and it supports import of java classes that will allow you to use for example, a DOM for xml-file parsing etc.
To use the resulting exe-file on a computer that does not have Matlab installed on it, you need to obtain the Matlab MCR and install it. The MCR must match exactly the version of Matlab you used to make the compiled code.
Regards,
Ivan