Modeling of Synthetic & Biological Macromolecules: A Journey

advertisement
Extending MATLAB
AE6382
Using MATLAB
• MATLAB can be used as a mathematical scripting language (.m
files)
• Stand-alone MATLAB applications
– MATLAB code can be converted to a stand-alone form
• requires a MATLAB Compiler toolbox license to compile
• no license required for the stand-alone file
• Extending MATLAB
– MATLAB can access shared libraries written in C/C++ and Fortran in
both Windows (DLL) and Unix/Linux
– MATLAB can access functions written in C/C++ and Fortran as MATLAB
functions, the so-called MEX files
– MATLAB and Java have a very close relationship
• MATLAB can use Java classes
• MATLAB and Java can exchange data using Java classes
AE6382
Using MATLAB
• Accessing MATLAB from other programs
– C/C++ and Fortran programs can access MATLAB
• Using the MATLAB Engine API (Windows and Unix/Linux)
• Using COM functions in Windows
– As an extension of the Standalone Application, a C/C++/Fortran callable
library that encapsulates a set of m-files can be built
– MATLAB and Excel can inter-operate (Excel can use MATLAB objects)
• Data Exchange applications
– C/C++ and Fortran can read and write MAT-files - files that contain
native MATLAB data
– MATLAB is able to read and write data in a variety of other formats
AE6382
Why
•
•
•
•
You can create a standalone application based on MATLAB that can
be freely distributed – no license required to run it
You have a complex application written in C/C++/Fortran that you
would like to access from within MATLAB. Compile and link as a
MATLAB function.
You need to load a large data set into MATLAB. Use either the
native text input functions of MATLAB or use MAT-Files. This will
require C/C++ or Fortran programming. The COM interface can also
be used when using Windows.
You have an m-function that you would like to use in Excel. The
MATLAB Excel Builder will create a COM object that can be used
from Excel. This capability is similar to the MATLAB Compiler
functionality.
AE6382
Why
•
•
•
You would like to make use of some feature that MATLAB provides
in a program that you currently have or are developing. The
MATLAB Engine API can be used for this purpose. It allows the
control of MATLAB from another process. This API is intended for
C/C++ and Fortran programmers, however, the COM Automation
interface can be used on Windows from a script. There are also
add-on modules for Python and Perl that provide Engine access
from those languages.
You would like to combine MATLAB with a Java program
You would like to create a Java GUI with MATLAB
AE6382
External MATLAB
The MATLAB manual that
describes the Compiler toolbox
that enables the creation of
standalone executables for use
on other systems that do have
have MATLAB installed.
AE6382
External MATLAB
•
•
•
•
The MATLAB manual that describes
the available external interfaces that
are available in MATLAB.
MAT-Files
Calling external libraries
Calling C/Fortran from MATLAB
–
•
Calling MATLAB from C/Fortran
–
•
•
•
MEX files (C/C++/Fortran)
Matlab Engine
Calling Java from MATLAB
COM interfaces in MATLAB (Windows)
Web Services
AE6382
External MATLAB
The MATLAB manual that
describes the interface
designed for Excel. It turns M
functions into COM objects that
can be accessed from with
Excel using VBA.
AE6382
External MATLAB
The MATLAB manual that
describes the interface to Java.
It converts MATLAB mfunctions into Java classes that
can be used from within a Java
program.
AE6382
External MATLAB
The MATLAB manual that
describes the API functions
that can be used by C/C++ and
Fortran programs to interact
with MATLAB.
• MAT-File
• MX Array Manipulation
• MEX-Files
• MATLAB Engine
AE6382
Standalone MATLAB Application
• Use MATLAB Compiler to generate a standalone application, library,
or component
• Requires the Compiler toolbox be licensed and installed on your
system
• Requires that an MCR (MATLAB Component Runtime) file be
installed on the target system
• Applications created using the MATLAB compiler are versions
specific and require the correct MCR file, it must match the MATLAB
version used to create the application
AE6382
Using MATLAB Compiler
• Use the MATLAB compiler to include the user supplied m-files in the
CTF file
• Create a wrapper C file and compile into an executable program
• Terms
– CTF is the Component Technology File
• this is an encrypted copy of your m-files and all dependencies (toolbox, …)
• once created it cannot be modified
• contains a copy of your preferences files
– MCR is the MATLAB Component Runtime
• this is a complete set of MATLAB runtime libraries that enables the
application to run
• supplied by MATLAB, usually ~200MB in size
– application executable
• this is the compiled wrapper code generated by MATLAB
• it contains the encryption keys that allow the CTF file to execute
AE6382
Setting Up MATLAB Compiler
• Before you can create your application the MATLAB compiler must
be configured – only required once per installation
• Determine what C/C++ compilers exist on your system
• Windows – supported compilers
– Lcc C is the built-in C compiler
– Microsoft Visual C/C++ (MSVC) Versions 6.0, 7.1, and 8.0
• Linux – supported compilers
– gcc and g++
• Setup environment
– mbuild –setup
– for Windows execute from a cmd.exe window
– creates the options file that is used by the mcc command
AE6382
Setting Up MATLAB Compiler
• mbuild on Linux R2007B
[matlab2007b]$ bin/mbuild -setup
Options files control which compiler to use, the compiler and link command
options, and the runtime libraries to link against.
Using the 'mbuild -setup' command selects an options file that is
placed in ~/.matlab/R2007b and used by default for 'mbuild'. An options
file in the current working directory or specified on the command line
overrides the default options file in ~/.matlab/R2007b.
To override the default options file, use the 'mbuild -f' command
(see 'mbuild -help' for more information).
The options files available for mbuild are:
1: /usr/local/matlab2007b/bin/mbuildopts.sh :
Build and link with MATLAB C-API or MATLAB Compiler-generated library via the system ANSI C/C++ compiler
0: Exit with no changes
/usr/local/matlab2007b/bin/mbuildopts.sh is being copied to
/home/latham/.matlab/R2007b/mbuildopts.sh
[matlab2007b]$
AE6382
Setting Up MATLAB Compiler
• mbuild on Windows R2007A
AE6382
Creating the MCR
• Windows R2007A
AE6382
Creating the MCR
• For MATLAB R2007A and before the buildmcr process is required
• Beginning with MATLAB R2007B the toolbox/deploy/<arch> directory
will contain the appropriate MCRInstaller file for that system
architecture
– Windows – MCRInstaller.exe
– Linux – MCRInstaller.bin
AE6382
Deploying the Application
• Deploying your standalone MATLAB application consists of copying
the CTF file, the MCR file, and the application executable to the
target system
– The target must be the same architecture of the system that built the
application
•
•
•
•
•
win32 – 32-bit Windows
glnx86 – 32-bit Linux
glnxa64 – 64-bit Linux
sol2 – Solaris
mac – OS/X
– Installation of the MCR is not required if that version of MATLAB is
already installed on the target system
– Having MATLAB and/or multiple MCR files requires care to ensure the
right libraries are loaded (see Compiler manual for all details)
AE6382
MATLAB Application Example
• There are two examples following
– They are compiled m-files that perform a matrix multiplication
– They are both compiled for Linux
– One is R2007B the other is R2006A
• Starting with R2007B the compile process has been altered slightly
– Rather than creating an MCRInstaller.zip file the installation includes
• MCRInstaller.exe for Windows
• MCRInstaller.bin for Linux
– The buildmcr is deprecated
• R2007A still includes buildmcr but it appears that the installer files
are present in the installation
• Performing this process in Windows is similar
• Graphics are allowed
AE6382
MATLAB Application Example
• Example performed on Linux R2007B
[app1]$ ls
app1.m
[app1]$ cat app1.m
a=rand(1000,1000);
b=rand(1000,1000);
tic
for i=1:1000
for j=1:1000
c(i,j)=0.;
for k=1:1000
c(i,j)=c(i,j)+a(i,k)*b(k,j);
end
end
end
toc
tic
a*b;
toc
[app1]$
AE6382
MATLAB Application Example
• Example performed on Linux R2007B
• Use the MATLAB Compiler (mcc) to create an application for the
app1.m script
[app1]$ mcc -m app1.m
sh: ifconfig: command not found
[app1]$ ls
app1
app1_main.c
mccExcludedFiles.log
app1.ctf
app1_mcc_component_data.c
readme.txt
app1.m
app1.prj
run_app1.sh
[app1]$
• The ls shows that mcc created several files
AE6382
MATLAB Application Example
• Example performed on Linux R2007B
• Copy the created files to the target system
– use tar to create an archive
– send tar file to remote system
– un-tar archive at target system
ON BUILD SYSTEM:
ON TARGET SYSTEM:
[app1]$ tar cf app1.tar .
[app1]$ tar xf app1.tar .
tar: ./app1.tar: file is the archive; not dumped
[app1]$
[app1]$ tar tf app1.tar
./
./readme.txt
./app1.prj
./run_app1.sh
./app1.ctf
…
./mccExcludedFiles.log
./app1_main.c
./app1
[app1]$
AE6382
MATLAB Application Example
• Example performed on Linux R2007B
• If the local system already has the version of MATLAB installed
–
–
–
–
this is the case for the build system
to test the program
no need to install the MCR files
use files at /usr/local/matlab2007b
AE6382
MATLAB Application Example
• Example performed on Linux R2007B
• Installing the MCR
– not required on build system
– not required on target if same version already installed
• Within a shell window, find the MCRInstaller.bin in the MATLAB
installation directory
– /usr/local/matlab2007b/toolbox/compiler/deploy/glnxa64/MCRInstaller.bin
– The underlined portion is determined by where the MATLAB distribution has been
installed
– The glnxa64 is the architecture, 64-bit Linux
– Copy to the target system
•
Execute the installer program
[app1]$ ./MCRInstaller.bin
AE6382
MATLAB Application Example
• Example performed on Linux
R2007B
• Installing the MCR
• This requires write access to
the /opt directory in this case
• The location can be moved but
the run scripts will need to be
altered
AE6382
MATLAB Application Example
• Example performed on Linux
R2007B
• Installing the MCR
AE6382
MATLAB Application Example
• Example performed on Linux R2007B
• Installing the MCR
• The MCR files were installed into
/opt/matlab/MATLAB_Component_Runtime/v77 (the default)
• This requires 469MB of disk in this case
AE6382
MATLAB Application Example
• Example performed on Linux R2007B
• Test on build system or target where appropriate MATLAB is already
installed
• Using run_app1.sh to execute the application
– This script takes care of all library path settings
[app1]$ ./run_app1.sh /usr/local/matlab2007b
-----------------------------------------Setting up environment variables
--Found MCR Java JRE version: 1.6.0
LD_LIBRARY_PATH is
.:/usr/local/matlab2007b/runtime/glnxa64:/usr/local/matlab2007b/bi
n/glnxa64:/usr/local/matlab2007b/sys/os/glnxa64:/usr/local/matlab2
007b/sys/java/jre/glnxa64/jre1.6.0/lib/amd64/native_threads:/usr/l
ocal/matlab2007b/sys/java/jre/glnxa64/jre1.6.0/lib/amd64/server:/u
sr/local/matlab2007b/sys/java/jre/glnxa64/jre1.6.0/lib/amd64/clien
t:/usr/local/matlab2007b/sys/java/jre/glnxa64/jre1.6.0/lib/amd64
Elapsed time is 27.425378 seconds.
Elapsed time is 0.287423 seconds.
[app1]$
AE6382
MATLAB Application Example
• Example performed on Linux R2007B
• On target system with MCR runtime files
• Using run_app1.sh to execute the application
– This script takes care of all library path settings
[app1]$ ./run_app1.sh /opt/MATLAB/MATLAB_Component_Runtime/v77
-----------------------------------------Setting up environment variables
--Found MCR Java JRE version: 1.6.0
LD_LIBRARY_PATH is
.:/opt/MATLAB/MATLAB_Component_Runtime/v77/runtime/glnxa64:/opt/M
ATLAB/MATLAB_Component_Runtime/v77/bin/glnxa64:/opt/MATLAB/MATLAB
_Component_Runtime/v77/sys/os/glnxa64:/opt/MATLAB/MATLAB_Componen
t_Runtime/v77/sys/java/jre/glnxa64/jre1.6.0/lib/amd64/native_thre
ads:/opt/MATLAB/MATLAB_Component_Runtime/v77/sys/java/jre/glnxa64
/jre1.6.0/lib/amd64/server:/opt/MATLAB/MATLAB_Component_Runtime/v
77/sys/java/jre/glnxa64/jre1.6.0/lib/amd64/client:/opt/MATLAB/MAT
LAB_Component_Runtime/v77/sys/java/jre/glnxa64/jre1.6.0/lib/amd64
Extracting CTF archive. This may take a few seconds, depending on
the
size of your application. Please wait...
...CTF archive extraction complete.
Elapsed time is 27.418982 seconds.
Elapsed time is 0.281665 seconds.
[app1]$
AE6382
MATLAB Application Example
• The following slides demonstrate the same procedure under earlier
versions of MATLAB
• This example was also performed on Linux using MATLAB R2006A
AE6382
MATLAB Application Example
• MATLAB R2006A Linux
• Compile into a standalone version
1. cd /home/latham/matlab/app1
2. mcc –m m2.m
This results in the following files being created in this directory
• m2 (this is the executable program)
• m2_main.c
• m2_mcc_component_data.c
• m2.ctf (the component technology file)
• mccExcludedFiles.log
The two files displayed in bold text are the important files
AE6382
MATLAB Application Example
•
•
MATLAB R2006A Linux
Test the executable just created
– Find where MATLAB is installed on the system. In this case MATLAB is
installed in /usr/local/matlab_2006a
– Now setup the library path
export LD_LIBRARY_PATH=/usr/local/matlab_2006a/sys/os/glnx86:/usr/local/matlab_2006a/bin/glnx86
• The m2 executable can now be run
./m2
AE6382
MATLAB Application Example
•
•
MATLAB R2006A Linux
Once the program is working it can be exported to another
computer.
– The target system must have the same architecture
– The same OS (compatible version in case of Linux)
– The correct version of the MCR
•
Copy the generated files to the remote system
– scp m2 user@target:matlab/
– scp m2.ctf user@target:matlab/
– Note that the matlab directory already exists on the target system
AE6382
MATLAB Application Example
•
•
MATLAB R2006A Linux
Setting up the target system requires that the MATLAB runtime
library be available
– the correct version of MATLAB is already installed on the target
– the MCRInstaller files are installed
•
Older versions of MATLAB require that the MCRInstaller.zip file
be created on the system where the application is compiled
– use buildmcr command to create file
•
Copy this file to the target
AE6382
MATLAB Application Example
•
•
MATLAB R2006A Linux
On the target system and unpack the file.
– cd /home/latham/matlab
– unzip MCRInstaller.zip
•
•
This will create a directory tree for the version of MATLAB used. In
this case the directory is named v74.
To execute the m2 program on this remote system setup the library
paths with
–
export LD_LIBRARY_PATH=/home/latham/matlab/v74/sys/os/glnx86:/home/latham/matlab/v74/runtime/glnx86
• Now execute
• ./m2
AE6382
MATLAB Application Example
•
•
MATLAB R2006A Linux
On the target system and unpack the file.
– cd /home/latham/matlab
– unzip MCRInstaller.zip
•
•
This will create a directory tree for the version of MATLAB used. In
this case the directory is named v74.
To execute the m2 program on this remote system setup the library
paths with
–
export LD_LIBRARY_PATH=/home/latham/matlab/v74/sys/os/glnx86:/home/latham/matlab/v74/runtime/glnx86
• Now execute
• ./m2
AE6382
MATLAB Excel Component
AE6382
MATLAB Excel Component
•
•
MATLAB compiler can be used to create components for use in
Excel
As for the Standalone application
– the MCR runtime files are required on the target system
– the m-files are encased in the CTF file
– a VBA (Visual Basic for Applications) wrapper is created that provides
access
– a DLL (Windows shared library) is created that contains the compiled
component code
•
•
•
The component is made available to Excel using the Microsoft
Component Object Model (COM)
The component is accessible through Excel macros
No example currently available
AE6382
MATLAB Excel Interaction
•
•
The Windows version of MATLAB also has access to other COM
components installed on a Windows system
Using the Automation capability of COM
– an instance of Excel can be created by a MATLAB m-file
– cells, worksheets, etc can be manipulated by the MATLAB script
•
Requires knowledge of the Excel object model
– This information can be found in the Office CD and at
http://msdn.microsoft.com
– also some documents also at
http://www.ae.gatech.edu/classes/ae6382/documents/MS_scripting/
•
For code and output see
– http://www.ae.gatech.edu/classes/ae6382/samples/matlab/excel-1/
AE6382
MATLAB Excel Interaction
%
Create a COM server running Microsoft Excel
% Create an interface "eWorkBooks"
e = actxserver ('Excel.Application')
eWorkbooks = e.Workbooks
% e =
% eWorkbooks =
%
COM.excel.application
%
Interface.Microsoft_Excel_9.0_Object_Library.Workbooks
% Make the Excel frame window visible
% List all methods for that interface
e.Visible = 1;
eWorkbooks.invoke
% Use the get method on the Excel object "e"
% ans =
% to list all properties of the application:
%
e.get
%
% ans =
%
Application: [1x1Interface.Microsoft_Excel_9.0_
Add: 'handle Add(handle, [Optional]Variant)'
Close: 'void Close(handle)'
%
Item: 'handle Item(handle, Variant)'
%
Open: 'handle Open(handle, string, [Optional]Variant)'
%
OpenText: 'void OpenText(handle, string, [Optional]Variant)'
%Object_Library._Application]
%
%
Creator: 'xlCreatorCode'
Workbooks: [1x1 Interface.Microsoft_Excel_9.0_
%Object_Library.Workbooks]
%
%
%
%
% Add a new workbook "w",
% also creating a new interface
w = eWorkbooks.Add
Caption: 'Microsoft Excel - Book1'
CellDragAndDrop: 0
ClipboardFormats: {3x1 cell}
% w =
%
Interface.Microsoft_Excel_9.0_Object_Library._Workbook
Cursor: 'xlNorthwestArrow'
%
.
% Close Excel and delete the object
%
.
e.Quit;
e.delete;
AE6382
MATLAB Excel Interaction
•
•
The Windows version of MATLAB also has access to other COM
components installed on a Windows system
Using the Automation capability of COM
– an instance of Excel can be created by a MATLAB m-file
– cells, worksheets, etc can be manipulated by the MATLAB script
•
Requires knowledge of the Excel object model
– This information can be found in the Office CD and at
http://msdn.microsoft.com
– also some documents also at
http://www.ae.gatech.edu/classes/ae6382/documents/MS_scripting/
•
For code and output see
– http://www.ae.gatech.edu/classes/ae6382/samples/matlab/excel-1/
AE6382
MATLAB Builder for Java
AE6382
MATLAB Builder for Java
•
•
•
The MATLAB Builder for Java is an extension of the MATLAB
Compiler that will wrap m-files as Java classes
The wrapped classes can then be used (without a MATLAB license)
by any Java program
Requires the MCR files on the system where the classes will be
used
AE6382
MATLAB Java Interaction
•
•
Java and MATLAB are tightly bound together – rich environment
There is a Java Runtime Environment (JRE) included as part of the
MATLAB installation
– need to be aware of what version of Java MATLAB is using
•
•
•
•
version -java
MATLAB can use Java classes
MATLAB can call Java methods internally
A simple example of what can be done
– accessing the Java Swing classes to create a GUI with MATLAB
– works in all architectures
import javax.swing.*
J=JFrame(‘Hi there’)
L=JLabel(‘A Label’);
P=J.getContentPane
P.add(L)
J.setSize(200,200);
J.setVisible(1)
AE6382
Add External Function to MATLAB
AE6382
Add External Function to MATLAB
The MEX-Files capability is used to create a custom C/C++ or Fortran
coded function that can be used in MATLAB.
The process can be tedious. It requires creating a gateway function,
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
that is called by MATLAB. This function is passed two variables that
indicate the number of input and output arrays. In addition, two other
C arrays are passed that contain pointers to the mxArray’s in the
case input. These pointers are used to access the data provided to
the function by the MATLAB call. The output array contains mxArray
pointers for the results. The result arrays are allocated by the C
program using the MATLAB API and their addresses passed back to
MATLAB. The mxArray type defines an array in MATLAB, it include
size, type (numeric, cell, …) and location.
AE6382
Download