用Matlab 的C++ Math Library解决工程问题
来源:互联网 发布:内网通话软件源码 编辑:程序博客网 时间:2024/06/08 06:18
Introduction
In the previous article, we studied how can use MATLAB C API to solve engineering problems. In this article I will show you how can use MATLAB C++ math library. The MATLAB� C++ Math Library serves two separate constituencies: MATLAB programmers seeking more speed or complete independence from interpreted MATLAB, and C++ programmers who need a fast, easy-to-use matrix math library. To each, it offers distinct advantages.
MATrix LABoratory
MATLAB is abbreviation of Matrix Laboratory. This means every computation was performed in matrix form. In other hand every data type wrapped in matrix form and every function take these matrix as an input argument.
For example you want to multiply to polynomial as follow:
A = (3x2 + 5x + 7) (4x5 + 3x3 - x2 + 1)
You can use two matrices for coefficients of any polynomials:
[3 5 7]
for (3x2 + 5x + 7)
and[40 3 -10 1]
for (4x5 + 3x3 - x2 + 1)
, usingconv
function, we can obtain coefficients of result:
conv([3 5 7], [4 0 3 -1 0 1]): A = [12 20 37 12 16 -4 5 7]
means:
A = 12x7 + 20x6 + 37x5 + 12x4 + 16x3 - 4x2 + 5x + 7
C++ Math Library
The MATLAB C++ Math Library consists of approximately 400 MATLAB math functions. It includes the built-in MATLAB math functions and many of the math functions that are implemented as MATLAB M-files. The MATLAB C++ Math Library is layered on top of the MATLAB C Math Library. The major value added by this C++ layer is ease of use.
The MATLAB C++ Math Library is firmly rooted in the traditions of the MATLAB runtime environment. Programming with the MATLAB C++ Math Library is very much like writing M-files in MATLAB. While the C++ language imposes several differences, the syntax used by the MATLAB C++ Math Library is very similar to the syntax of the MATLAB language. Like MATLAB, the MATLAB C++ Math Library provides automatic memory management, which protects the programmer from memory leaks.
Every matrices represented by mwArray
class, a data type introduced byMATLAB for constructing a matrix. As I said before, every data must be wrapped in a matrix form in other hand:mwArray.
One C++ prototype supports all the possible ways to call a particular MATLAB C++ Math Library function. You can reconstruct the C++ prototype by examining theMATLAB syntax for a function. In the following procedure, theMATLAB functionsvd()
is used to illustrate the process.
MATLAB Syntax
s = svd (X)[U, S, V] = svd (X)[U, S, V] = svd (X, 0)
In this example, the prototype that corresponds to [U, S, V] = svd (X, 0) is constructed step-by-step. Until the last step, the prototype is incomplete.
Adding the Output Arguments
- Subtract out the first output argument, U, to be the return value from the function. The data type for the return value is
mwArray
.Collapse |Copy CodemwArray svd(
- Add the remaining number of output arguments, S and V, to the prototype as the first, second, etc., arguments to the function. The data type for an output argument is
mwArray
*.Collapse |Copy CodemwArray svd (mwArray* S, mwArray* V,
Adding the Input Arguments
- Add the number of input arguments to the prototype, X and Zero, one after another following the output arguments. The data type for an input argument is
mwArray
.Collapse |Copy CodemwArray svd (mwArray* S, mwArray* V, const mwArray& X, const mwArray& Zero);
The prototype is complete.
How to Translate a MATLAB Call into a C++ Call
This procedure translates the MATLAB call [U, S, V] = svd (X, 0)
into a C++ call. The procedure applies to library functions in general. Note that within a call to a MATLAB C++ Math Library function, an output argument is preceded by &; an input argument is not.
- Declare input, output, and return variables as
mwArray
variables, and assign values to the input variables. - Make the first MATLAB output argument the return value from the function.Collapse |Copy Code
U = svd (
- Pass any other output arguments as the first arguments to the function.Collapse |Copy Code
U = svd (&S, &V,
- Pass the input arguments to the C++ function, following the output arguments.Collapse |Copy Code
U = svd (&S, &V, X, 0);
The translation is complete.
Note that if you see [] as a MATLAB input argument, you should pass mwArray()
as the C++ argument. For example,
B = cplxpair (A, [], dim)
becomes
B = cplxpair (A, mwArray(), dim);
mwArray class
The mwArray
class public interface is relatively small, consisting of constructors and destructor, overloaded new and delete operators, one user-defined conversion, four indexing operators, the assignment operator, input and output operators, and array size query routines. The mwArray
�s public interface does not contain any mathematical operators or functions.
Constructors
The mwArray
interface provides many useful constructors. You can construct amwArray
object from the following types of data: a numerical scalar, an array of scalars, a string, anmxArray*
, or anothermwArray
object.
mwArray()
Create an uninitialized array. An uninitialized array produces warnings when passed to MATLAB C++ Math Library functions. If an array is created using this default constructor, a value must be assigned to it before passing it to a MATLAB C++ Math Library function.
To create an empty double matrix that corresponds to [] in MATLAB, use the
function empty()
.
mwArray (const char *str)
Create an array from a string. The constructor copies the string.
mwArray(int32 rows, int32 cols, double *real, double *imag = NULL)
Create a mwArray
from either one or two arrays of double-precision floating-point numbers. If two arrays are specified, the constructor creates a complex array; both input arrays must be the same size. The data in the input arrays must be in column-major order, the reverse of C++�s usual row-major order. This constructor copies the input arrays.
Note that the last argument, imag, is assigned a value of NULL in the constructor.imag
is an optional argument. When you call this constructor, you do not need to specify the optional argument.
mwArray (const mwArray& mtrx)
Copy a mwArray
. This constructor is the familiar C++ copy constructor, which copies the input array. For efficiency, this routine does not actually copy the data until the data is modified. The data is referenced through a pointer until a modification occurs.
mwArray (const mxArray* mtrx)
Make a mwArray
from an mxArray
*, such as might be returned by any of the routines in the MATLAB C Math Library or the Application Program Interface Library. This routine does not copy its input array, yet the destructor frees it; therefore the input array must be allocated on the heap. In most cases, for example, with matrices returned from the Application Program Interface Library, this is the desired behavior.
mwArray (double start, double step, double stop)
Create a ramp. This constructor operates just like the MATLAB colon (:) operator. For example, the callmwArray(1,0.5,3)
creates the vector[ 1, 1.5,2, 2.5,3 ]
.
mwArray (int32 start, int32 step, int32 stop)
Create an integer ramp.
mwArray (const mwSubArray & a)
Create an mwArray
from an mwSubArray
. When an indexing operation is applied to an array, the result is not another array, but anmwSubArray
object. An mwSubArray
object remembers the indexing operation. Evaluation of the operation is deferred until the result is assigned or used in another expression. This constructor evaluates the indexing operation encoded by themwSubArray
object and creates the appropriate array.
mwArray (double)
Create a 1-by-1 mwArray
from a double-precision floating-point number.
mwArray (int)
Create an mwArray
from an integer.
Table 1 shows mwArray
constructors in brief.
mwArray()
Uninitialized array
mwArray A;
mwArray (const char *)
String array
mwArray A ("MATLAB Rules");
mwArray (int32, int32, double*, double*)
Complex array
double real[] = { 1, 2, 3, 4 };
double imag[] = { 5,6,7, 8 };
mwArray A(2,2,real,imag);
mwArray (const mwArray&)
Copy of input array
mwArray A = rand(4);
mwArray B (A);
mwArray (const mxArray*)
Copy of mxArray*
mxArray *m = mlfScalar(1);
mwArray mat (m);
mwArray (double, double, double)
Ramp
mwArray A(1.2,0.1,3.5);
mwArray (int32, int32, int32)
Integer ramp
mwArray A(1, 2,9);
mwArray (const mwSubArray&)
Array from subarray (used in indexing)
mwArray A = rand(4);
mwArray B(A(3,3));
mwArray (double)
Scalar double array
mwArray A(17.5);
mwArray (int)
Scalar integer array
mwArray A(51);
Mathematical Functions
Below is a list of useful mathematical functions of MATLAB C++ math library:
plus, minusmtimes, mpoweracos, asinconvconjdec2bin, dec2hexdispfft, fft2linspacemax, minrootsrot90
Using C++ Math Library
To add support of MATLAB C++ Math Library follow these instructions:\
- Add following line at the end of stdafx.hCollapse |Copy Code
#include <matlab.hpp>
matlab.hpp is interface of MATLAB C++ math library. Add directory ofMATLAB interface files (*.hpp) to Visual Studio (Tools -> Options -> Directories). For example:x:\matlab\extern\include\cpp, where x is drive letter of matlab path.
- Add desired libraries to your project (In this example, libmatpm.lib)
- Compile your project!
Sample Program
#include "stdafx.h"#include "matlab.hpp" //Interface of MATLAB CPP Math Library//Add C++ Math Library to project#pragma comment(lib, "libmatpm.lib")#pragma comment(lib, "libmx.lib")#pragma comment(lib, "libmatlb.lib")#pragma comment(lib, "libmat.lib")#pragma comment(lib, "libmmfile.lib") #pragma comment(lib, "libmatpm.lib")int main(int argc, char* argv[]){ mwArray A, B, C; A = magic(mwArray(5)); B = transpose(A); //B=A' C = plus(A,B); //C = A + B; C = minus(A,B); //C = A - B; C = mtimes(A,B); //C = A * B; double arr1[]={3.0, 2.0, 5.0, -1.0}; double arr2[]={8.0, 1.0, 3.0, -2.0}; mwArray D(1, 4, arr1); mwArray E(4, 1, arr2); C = D * E; //4*4 matrix mwArray F(0.0, 0.1, 5.0); //create double ramp F = F * transpose(F); A.Print("A");//Magic Matrix, Order=5 C.Print("C"); D.Print("D"); return 0;}
Known Problems
- Compiler reports error when compiling matlab.hpp:Collapse |Copy Code
c:\matlab\extern\include\cpp\matmtxif.h (16):fatal error C1083: Cannot open include file strstream.h.No such file or directory.
Solution:
This error is due to missing preprocessor definitions in the MSVC environments. In order to alleviate this problem, the following definitions must be added to the project file for the application:
- MSVC
- MSWIND
- IBMPC
- D__STDC_
Add these preprocessors to your project: Project->Settings->C/C++->Preprocessor definitions.
- Linker reports error when linking MATLAB library files:Collapse |Copy Code
LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFUALTLIB:library.\ex1.exe : fatal error LNK1169: one or more multiply defined symbols foundError executing link.exe
Solution:
To resolve this problem change project settings to build a Multithread Dll in the Runtime Library. Do this by following these instructions:
- Selecting Project from the main menu
- Selecting Settings
- Clicking on C/C++ tab
- Selecting Code Generation in the Category pulldown menu
- In the Runtime Library field selecting Multithread Dll ("Debug Multithread Dll" willnot work)
- Click OK
- Rebuild your project
- 用Matlab 的C++ Math Library解决工程问题
- 解决ant打包时有依赖工程(library)的方法
- Eclipse 引用外部library工程,运行时报NoClassDefFoundError的解决
- Matlab内存不足问题的解决
- Matlab内存不足问题的解决
- matlab过期问题的解决
- required library rt.jar问题的解决
- Android的Library工程
- Android的Library工程
- Android studio 导入library工程,无法找到类的问题
- Ubuntu下math库函数编译时未定义问题的解决
- 解决一个Linux下C语言工程无法调试的问题
- stm32建c++与c混合工程遇到的问题及解决
- stm32建c++与c混合工程遇到的问题及解决
- stm32建c++与c混合工程遇到的问题及解决
- <zz>Matlab内存不足问题的解决【转】
- 大工程Eclipse内存不足问题的解决
- xcode 工程 sdk missing 问题的解决
- linux C程序中获取shell脚本输出(如获取system命令输出)
- 3D引擎--可移植到Android的开源的引擎
- flex gds配置
- Extjs学习总结之18布局与表单初始化
- 一个特别的multiple definition错误
- 用Matlab 的C++ Math Library解决工程问题
- @使用一个用户创建目录--特殊用法@
- ios键盘自适应
- 设计模式——策略模式_Strategy Pattern
- Android中的"Unable to start activity ComponentInfo"或者"Unable to instantiate activity ComponentInfo"的错误
- java基础
- 弹性“跑道“模型
- SDL(Simple DirectMedia Layer)
- JAVASCRIPT IE 与 FF 中兼容笔记