利用Matlab Coder 将matlab文件转化为c++文件导入到相应项目中

1.打开matlab coder

2.选择相应的matlab文件,选择next

 3.定义输入变量或者全局变量

        选择let me enter input or global types directly

        弹出下面的内容,可以进行相应变量的定义,以及可以对其添加全局变量,确定好变量的信息后,可以选择next

4.选择next

5.弹出以下界面后,在matlab中进行相应的编译设置,输入mex -setup,选择mex -setup C++

  5.在编译前可以进行相应的设置,使得编译后的文件更加简洁,去冗余

1)选择more settings

 2)这两个选项如果不需要用到,可以取消勾选,需要看自己的代码确定

 3).如果不需要输入输出的size发生变化,可以取消以下勾选

 4)把所有函数放到同一个文件,可以简化程序,这个选项一般默认是一个函数一个文件 

5)对于示例文件,可以选择不生成示例文件,减小源文件冗余

6.选择生成generate,等待生成相应的C++源文件,生成后的页面如下 

7.选择next,并将相应的源文件打包

8.将转换好的源文件导入到项目中,注意要在属性附加目录中包含相应的目录,否则,无法读取头文件

9.test文件为main文件,可调用r1进行旋转角度计算,具体代码如下

// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//以上为文件说明

#include <iostream>
#include"r1.h"

using namespace std;
//下面要用到的cout包含在头文件iostream中,如果希望只要用cout来进行输出,可以补充上面的语句
int main()
{
	cout << "请输入角度:";
    //cout类似print
	double theta;
	//调用前必须先声明
	cin >> theta;
	//输入角度
	double r[9] = { 0,0,0,0,0,0,0,0,0 };
	r1(theta, r);
	//调用旋转矩阵计算公式

	cout << r[0] << " " << r[3] << " " << r[6] << "\n" << r[1] << " " << r[4] << " " << r[7] << "\n" << r[2] << " " << r[5] << " " << r[8] << endl;
	
	cout << "检验顺序:\n";
	double b[9] = { 0,1,2,3,4,5,6,7,8 };
	cout << b[0] << " " << b[1] << " " << b[2] << "\n" << b[3] << " " << b[4] << " " << b[5] << "\n" << b[6] << " " << b[7] << " " << b[8] << endl;
	//以上两个语句用于观察相应的数组顺序
}

 其中,r1为利用matlab文件转换获取的,matlab源文件如下

function r1=r1(theta)
r1=[cos(theta)  0     -sin(theta) ;
   sin(theta)  0     cos(theta);
   0          -1          0     ;];
end

转换成C++后的源文件如下

#include "r1.h"
#include <cmath>

// Function Definitions
//
// Arguments    : double theta
//                double b_r1[9]
// Return Type  : void
//
void r1(double theta, double b_r1[9])
{
  double b_r1_tmp;
  double r1_tmp;
  // 当为坐标系编号奇数时的旋转矩阵,即对应theta1,3,5,7;对应q2,4,6,因为q1为移动变量
  r1_tmp = std::sin(theta);
  b_r1_tmp = std::cos(theta);
  b_r1[0] = b_r1_tmp;
  b_r1[3] = 0.0;
  b_r1[6] = -r1_tmp;
  b_r1[1] = r1_tmp;
  b_r1[4] = 0.0;
  b_r1[7] = b_r1_tmp;
  b_r1[2] = 0.0;
  b_r1[5] = -1.0;
  b_r1[8] = 0.0;
}

//
// Arguments    : void
// Return Type  : void
//
void r1_initialize()
{
}

//
// Arguments    : void
// Return Type  : void
//
void r1_terminate()

调用时,要注意以下,我们matlab和C++的数组顺序有些不同。

以下为C++计算结果和matlab计算结果的对比,由于编号方法略微不同,所以在进行输出调用的时候,需要注意转换的r1.h中的顺序采用的是matlab中的编号顺序。因此在输出时,为0,3,6;1,4,7;2,5,8;其中还要注意一点就是C++起始编号为0。

cout << r[0] << " " << r[3] << " " << r[6] << "\n" << r[1] << " " << r[4] << " " << r[7] << "\n" << r[2] << " " << r[5] << " " << r[8] << endl;

最后,结果一致,转化成功!

 

 

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值