概述
VS2017调用Matlab函数
- 1.环境配置
- 2.Matlab函数编译
- 3.传入字符串参数
1.环境配置
1.在vs中新建项目-》右键-》属性,在包含目录添加如下内容(4条)(自己的Matlab安装路径):
2.在库目录中添加以下内容(3条):
3.在链接器-》输入-》附加依赖项加入如下内容:
2.Matlab函数编译
在终端输入deploytool-》选择Library Complier-》选择C++Shared Library,打包完生成的文件如下:
把add.h
add.lib
add.dll
三个文件复制到vs工程目录下。
在链接器-》输入-》附加依赖项加入add.lib
,头文件添加现有项,把add.h
添加进来。
#include <iostream>
#include "add.h"
using namespace std;
int main()
{
int a, b, c;
a = 10;
b = 20;
addInitialize(); //在使用add函数前一定要初始化
if (!addInitialize()) {
cout << "初始化失败!" << endl;
}
//构建C++和matlab数据交换的对象mwArray
//mwArray(mwSize num_rows, const mwSize num_cols, mxClassID mxID,mxComplexity cmplx = mxREAL)
mwArray a1(1, 1, mxINT32_CLASS);
mwArray b1(1, 1, mxINT32_CLASS);
mwArray c1(1, 1, mxINT32_CLASS);
a1.SetData(&a, 1);
b1.SetData(&b, 1);
add(1, c1, a1, b1);
c = c1.Get(1, 1);
cout << c << endl;
addTerminate(); //结束调用
}
其中 mwArray
是一种matlab
与VS
交互用的数据结构,需要注意的是matlab
数组是从1开始的,C++
是从0开始的。
rows:行数
cols:列数
type:类型
mwArray A(rows, cols, type)
其中type
有如下类型:
typedef enum
{
mxUNKNOWN_CLASS = 0, //未知类型
mxCELL_CLASS, //细胞类型
mxSTRUCT_CLASS, //结构类型
mxLOGICAL_CLASS, //布尔类型
mxCHAR_CLASS, //字符串类型
mxVOID_CLASS, //void类型
mxDOUBLE_CLASS, //双精度浮点数,对应C++ double类型
mxSINGLE_CLASS, //单精度浮点数
mxINT8_CLASS, //
mxUINT8_CLASS,
mxINT16_CLASS,
mxUINT16_CLASS,
mxINT32_CLASS, //对应C++ int类型
mxUINT32_CLASS,
mxINT64_CLASS,
mxUINT64_CLASS,
mxFUNCTION_CLASS, //函数类型
mxOPAQUE_CLASS, //
mxOBJECT_CLASS //对象类型
}
常用的有mxCHAR_CLASS
, mxDOUBLE_CLASS
,mxINT32_CLASS
等。
创建mwarray
的常用方法如下表格:
方法 | 创建内容 |
---|---|
mwArray() | 创建空的Matlab阵列,类型为mxDOUBLE_CLASS |
mwArray(mxClassID mxID) | 创建mxID指定类型的Matlab阵列 |
mwArray(mwSize num_rows,mwSize num_cols,mx_ClassID mxID,mxCompleixity complex=mxREAL) | 创建行数为num_rows ,列数为num_cols ,类型为mxID 的Matalb阵列,对于数值型阵列,将complx 做为最后一个参数,确定待创建阵列是否为复数阵列 |
mwArray(const char*str) | 根据字符串str 创建一个新的字符型阵列 |
mwarray
类的常用函数如下:
方法 | 含义 |
---|---|
mwSize NumberOfNonZeros()const | 返回稀疏阵列非零元素的个数 |
mwSize NumberOfElements()const | 返回阵列中元素的个数 |
mwSize NumberofDimensions()const | 返回阵列维数 |
mwSize MaximumNonZeros()const | 返回稀疏阵列中最大的元素的个数 |
mwArray Get(mwSize num_indices,....) | 根据索引返回阵列元素,其中num_indices 表示索引数目。Get函数中输入的索引均从1起始 |
double nums[4] = { 1.0,2.0,3.0,4.0 };
double num;
mwArray data(2, 2, mxDOUBLE_CLASS);
data.SetData(nums, 4);
num = data.Get(1, 2); //2.0
cout << num << endl;
num = data.Get(2, 1, 2); //3.0
cout << num << endl;
需要注意的是:
int a[6] = {1,2,3,4,5,6}
mwArray A(2,3,mxINT32_CLASS);
A.SetData(a,6);
这种方式生成的mwArray
为如下形式:
[
1
3
5
2
4
6
]
(3)
left[ begin{matrix} 1 & 3 & 5 \ 2 & 4 & 6 end{matrix} right] tag{3}
[123456](3)
如果要生成下面这种形式:
[
1
2
3
4
5
6
]
(3)
left[ begin{matrix} 1 & 2 & 3 \ 4 & 5 & 6 end{matrix} right] tag{3}
[142536](3)
需要这样赋值:
int a[6] = {1,2,3,4,5,6}
mwArray A(3,2,mxINT32_CLASS); //修改此处:行列数互换
A.SetData(a,6); //第二个参数为要设置的数的个数,大小可设为rows*cols
此时生成的矩阵为:
[
1
4
2
5
3
6
]
(3)
left[ begin{matrix} 1 & 4\ 2 & 5 \ 3 & 6 end{matrix} right] tag{3}
⎣⎡123456⎦⎤(3)
然后在.m
文件中进行转置操作即可,这点需要特别注意,尤其在传入图片时。
3.传入字符串参数
传入字符串直接传入char*
即可。
char* str = "abcdef";
mwArray mwA(str);
参考文章:
[1] Matlab代码转C++(二) —— mwArray
[2] C++调用MATLAB程序,以及常用问题解决
最后
以上就是碧蓝小鸽子为你收集整理的1.VS2017调用Matlab函数1.环境配置2.Matlab函数编译3.传入字符串参数的全部内容,希望文章能够帮你解决1.VS2017调用Matlab函数1.环境配置2.Matlab函数编译3.传入字符串参数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复