环境声明:Matlab R2013a
在这里,我将Matlab下的pinv函数转成了C代码
<1>编写一个函数
function b = funcpinv( a )%#codegen
%FUNCPINV Summary of this function goes here
% Detailed explanation goes here
b = pinv(a);
end
<2>在命令窗口,输入mex -setpu,选中一个存在的编译器
<3>在命令窗口输入coder(图形界面),回车,弹出Coder Generation Project对话框
<4>在name中输入项目名 funcpinv.prj,点OK,弹出MATLAB Coder对话框
<5>点Entry-Point Files右下角的Add files,选择文件funcpinv.m打开
<6>点变量a右边的click to define,在这里我定义了double 3*3
<7>选中Build选项卡,Output type中选择c/c++ Static Library;选中Generate code only
<8>在More settings的Speed中去掉support non-finite numbers,如果想生成C++代码,在All Settings中找到Advanced一栏,将其中的language选为C++
<9>点击Build,进行编译;点击View report,弹出Code Generation Report对话框,可以查看相应的代码
<10>在VS2005下编写测试代码:
// TestPinv.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
extern "C"
{
#include "funcpinv.h"
};
int _tmain(int argc, _TCHAR* argv[])
{
real_T matrix[9],matrix_pinv[9];
int i = 0;
for (i = 0;i < 9;i++)
{
matrix[i] = i + 1;
}
for (i = 0;i < 9;i++)
{
matrix_pinv[i] = 0;
}
for (i = 0;i < 9;)
{
std::cout<<matrix[i]<<"\t"<<matrix[i+1]<<"\t"<<matrix[i+2]<<std::endl;
i += 3;
}
std::cout<<"start to pinv"<<std::endl;
funcpinv(matrix,matrix_pinv);
std::cout<<"pinv is finish"<<std::endl;
std::cout<<"The matrix_pinv is"<<std::endl;
for (i = 0;i < 9;)
{
std::cout<<matrix_pinv[i]<<"\t"<<matrix_pinv[i+1]<<"\t"<<matrix_pinv[i+2]<<std::endl;
i += 3;
}
return 0;
}
注:Matlab build得到的是C代码,在编译时右键点击funcpinv.c,选择Properties,在对话框中选择Precompiled Headers,Create/use Precompiled Headers一栏选择Not Using Precompiled Headers
得到的结果:
参考:
1、录制的网上研讨会的MATLAB Coder视频