matlab尝试引用非结构体字段,[转载]C++中调用Matlab库函数

2microsoftmsvc60和D:MatLab6dot5externlibwin32。

4、需要说明的是,第3步的设置是属于编译器的,也就是说,第3步的设置只需要设一次VC6.0就会铭记于心了。而在这一步要进行的设置是工程设置,这个设置是针对具体的工程的,所以,每一个要调用MatLab数学库的函数都要进行这一设置:“工程”—>“设置”把开“Project

Settings”对话框,然后在对话框中的

1)"c/c++"—>"分类"下拉框中选“预处理器”在“预处理器定义”文本框中增加MSVC,IBMPC,MSWIND这三个指令。

2)"c/c++"—>"分类"下拉框中选“Code Generation”,在“Use run time

library”下拉框中选中“Multithreaded DLL”。

3)“连接”—>“对像/库模块”文件框中增加libmatpm.lib libmmfile.lib libmatlb.lib

libmat.lib libmx.lib 这个静态库。

。。。。所有的设置终于做完了,非常的辛苦,要不然怎么叫C++呢。。。。。。。。继续:

5、在工程(刚才说了,这是一个DLL工程)中添加一个源文件,就叫s.cpp吧,在s.cpp中输入以下代码:

#include "matlab.hpp"

#include

int LU(int n,double* A,double* B,double* X)

{

mwArray a(n,n,A);

mwArray b(n,1,B);

mwArray L;

mwArray U;

mwArray x;

L=lu(&U,a);

x=mldivide(U,mldivide(L,b));//用LU分解求方程组

x.ExtractData(X);//得到mwArray中的数

return 1;

}

说明一下这段代码:首先,#include

"matlab.hpp"是必不可少的,要不然编设器真不知道我是调用MatLab中的函数。其次,在MatLab的世界里,所有的数(组)都是矩阵,哪怕只是做一个简单的1+1=2,其实都是矩阵们之间的交易。c++数学库函数的调用方式和MatLab里的调用方式非常相似,当然进行交易的也都是一些矩阵,这里的mwArray类(注意,这是一类),就是一个矩阵,在C库里面就是mxArray结构体,mwArray类其实是有一个指向一个mxArray结构体的指针,关于这个就不多说了。其实关于这个看是很简单的函数,如果细细的去读它,会发现一些小问题(这里的问题不是说这个函数有错),这些问题是须要弄明白的。

6、要使这个dll知道它其有被“别人”调用的功能,就必须要声明哪些函数(当然这个例子中只有一个函数,但实际上,可能不只一个)是要导出的。关于这个有两种方式,我在这里采用的是一种通过性较好的方式——运用.def文件。所以,在这个工程中增加一个文体文件,并把它命名为“dll_1.def”,这里的.def护展名需要手动的键入。并在dll_1.def中输入以下的代码:

LIBRARY dll_1

EXPORTS

LU @1

说明一下,“LIBRARY”之后的“dll_1”是工程名,也是要生成的DLL的名字,这里的"EXPORTS"的中文意思好像是输出吧,呵呵。“LU”当然就是刚才在s.cpp文件中写的那个函数的名字了。

7、编译工程,生成dll。“组建”—>“组建[dll_1.dll]”。于是,会发现在工程所在的文件目录下就的bin/Debug文件夹中就生成了一个dll_1.dll文件了,这就是我们想要的东西了。

8、在C#中调用dll_1.dll中的函数(具体来说,是调用LU这个函数)。打开VS2008,新建一个C#窗口工程吧。啊,刚刚把vc6.0关掉,现在又打开VS2008,真是倍感亲切和畅快,因为在C#里面,好像一切都不那么拘束了,很随便。在C#里,没有单独的函数了,所有都是对像,函数就只能存在于对像之内了,像调入的C++DLL中的函数,一般都只能是对像的静态成员函数。于是,在工程中增加一个类,随便取个名字吧,叫cppDllInvokeDemo,具体的代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Runtime.InteropServices; //注意加入这个命名空间

namespace CshapWinInvokeCppDll

{

class cppDllInvokeDemo

{

const string dll_1 = "dll_1.dll";

[DllImport(dll_1, CallingConvention =

CallingConvention.Cdecl)]

public static extern int LU(int n, double[] A,double[]

B,double[] X);

}

}

说明一下:using

System.Runtime.InteropServices;这个命名空间是必须的。由于不想在C#里面用指针,所在这里的LU函数签名内指针变成了数组,这个转换是非常顺畅的。

9、在C#的这个工程中调用这个LU函数.示例代码如下:

private void button3_Click(object sender, EventArgs e)

{

double[] A = { 2, 1, 0, 1, 1, -5, 2, 6, -5, 0, 1, -1, 1, 7, -1,

-4 };

double[] B = { 13, -9, 6, 0 };

double[] X=new double[4];

cppDllInvokeDemo.LU(B.Length, A, B, X);

textBox3.Text = X[0].ToString();

}

显然上面这个函数是一个事件处理函数,也很显然我的窗口中有一个button3按件和一个textBox3文框。

Good luck!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值