我是靠谱客的博主 碧蓝小鸽子,最近开发中收集的这篇文章主要介绍1.VS2017调用Matlab函数1.环境配置2.Matlab函数编译3.传入字符串参数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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是一种matlabVS交互用的数据结构,需要注意的是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.传入字符串参数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部