chckxy函数 matlab,matlab 2012 vs2010混合编程

电脑配置:

操作系统:window 8.1

Matlab 2012a安装路径:D:\Program Files\MATLAB\R2012a

VS2010 :

OpenCV 2.4.3:D:\Program Files\opencv

补充说明:

在配置前,先检查一下系统变量:

1.若缺少系统变量(该路径必须添加!!!):

D:\Program Files\MATLAB\R2012a\runtime\win64

导致结果:程序无法正常启动0x000007b。请单击“确定”关闭应用程序

注意变量配置后记得重启才会生效,而且添加路径要在英文符号下加入” ; ”,末尾不需要加分号!!!!

2.其他变量:可加可不加,经验证不会影响结果!!!

(1)用户变量:

D:\Program Files\MATLAB\R2012a\bin\win64

D:\Program Files\MATLAB\R2012a\runtime\win64

(2)系统变量:

D:\Program Files\MATLAB\R2012a\bin\win64

本文转自博客:http://www.cnblogs.com/newpanderking/articles/4057977.html

1、背景

众所周知,matlab在处理矩阵、数学计算、计算机仿真、图像处理等方面有着 c c++无可比拟的优势,但是做成系统供使用时,又显得过于粗糙,为了使用起来高大上,计算起来有简单,方便。无疑,c++ 与matlab混合编程将会使非常靠谱的选择。

这里暂且不论所谓的matlab效率低,c/c++效率高的问题,自我感觉,以我目前编码的功底,所编写的代码的效率远远不及matlab提供的代码的效率。除非你是大牛,或者你是人云亦云,所以能用matlab混合c++编码还是很不错的选择,话不多说,我们开始讨论正题。

2、我使用的版本是matlab2012与vs2010混合编程的。

软件的下载这里就不多说了,我相信看这篇教程的你,这两个软件已经安装的妥妥当当的了。

这里我选用网上常用来做例子的matlab代码做测试,spline.m,该文件位于

D:\Program Files\MATLAB\R2012a\toolbox\matlab\polyfun

当然该文件中依赖调用另一个文件chckxy.m,该文件也在这条路径下。找到后复制到matlab的工作目录下。

这里为了方便提供两个文件的代码:

spline.m

function output = spline(x,y,xx)

%SPLINE Cubic spline data interpolation.

% PP = SPLINE(X,Y) provides the piecewise polynomial form of the

% cubic spline interpolant to the data values Y at the data sites X,

% for use with the evaluator PPVAL and the spline utility UNMKPP.

% X must be a vector.

% If Y is a vector, then Y(j) is taken as the value to be matched at X(j),

% hence Y must be of the same length as X -- see below for an exception

% to this.

% If Y is a matrix or ND array, then Y(:,...,:,j) is taken as the value to

% be matched at X(j), hence the last dimension of Y must equal length(X) --

% see below for an exception to this.

%

% YY = SPLINE(X,Y,XX) is the same as YY = PPVAL(SPLINE(X,Y),XX), thus

% providing, in YY, the values of the interpolant at XX. For information

% regarding the size of YY see PPVAL.

%

% Ordinarily, the not-a-knot end conditions are used. However, if Y contains

% two more values than X has entries, then the first and last value in Y are

% used as the endslopes for the cubic spline. If Y is a vector, this

% means:

% f(X) = Y(:end-), Df(min(X))=Y(), Df(max(X))=Y(end).

% If Y is a matrix or N-D array with SIZE(Y,N) equal to LENGTH(X)+, then

% f(X(j)) matches the value Y(:,...,:,j+) for j=:LENGTH(X), then

% Df(min(X)) matches Y(:,:,...:,) and Df(max(X)) matches Y(:,:,...:,end).

%

% Example:

% This generates a sine-like spline curve and samples it over a finer mesh:

% x = :; y = sin(x);

% xx = :.:;

% yy = spline(x,y,xx);

% plot(x,y,'o',xx,yy)

%

% Example:

% This illustrates the use of clamped or complete spline interpolation where

% end slopes are prescribed. In this example, zero slopes at the ends of an

% interpolant to the values of a certain distribution are enforced:

% x = -:; y = [ . 1.12 2.36 2.36 1.46 . . ];

% cs = spline(x,[ y ]);

% xx = linspace(-,,);

% plot(x,y,'o',xx,ppval(cs,xx),'-');

%

% Class support for inputs x, y, xx:

% float: double, single

%

% See also INTERP1, PCHIP, PPVAL, MKPP, UNMKPP.

% Carl de Boor --

% Copyright - The MathWorks, Inc.

% $Revision: 5.18.4.6 $ $Date: // :: $

% Check that data are acceptable and, if not, try to adjust them appropriately

[x,y,sizey,endslopes] = mychckxy(x,y);

n = length(x); yd = prod(sizey);

% Generate the cubic spline interpolant in ppform

dd = ones(yd,); dx = diff(x); divdif = diff(y,[],)./dx(dd,:);

if n==

if isempty(endslopes) % the interpolant is a straight line

pp=mkpp(x,[divdif y(:,)],sizey);

else % the interpolant is the cubic Hermite polynomial

pp = pwch(x,y,endslopes,dx,divdif); pp.dim = sizey;

end

elseif n==&&isempty(endslopes) % the interpolant is a parabola

y(:,:)=divdif;

y(:,)=diff(divdif')'/(x()-x());

y(:,)=y(:,)-y(:,)*dx();

pp = mkpp(x([,]),y(:,[ ]),sizey);

else % set up the sparse, tridiagonal, linear system b = ?*c for the slopes

b=zeros(yd,n);

b(:,:n-)=*(dx(dd,:n-).*divdif(:,:n-)+dx(dd,:n-).*divdif(:,:n-));

if isempty(endslopes)

x31=x()-x();xn=x(n)-x(n-);

b(:,)=((dx()+*x31)*dx()*divdif(:,)+dx()^*divdif(:,))/x31;

b(:,n)=...

(dx(n-)^*divdif(:,n-)+(*xn+dx(n-))*dx(n-)*divdif(:,n-))/xn;

else

x31 = ; xn = ; b(:,[ n]) = dx(dd,[ n-]).*endslopes;

end

dxt = dx(:);

c = spdiags([ [x31;dxt(:n-);] ...

[dxt();*(dxt(:n-)+dxt(:n-));dxt(n-)] ...

[;dxt(:n-);xn] ],[- ],n,n);

% sparse linear equation solution for the slopes

mmdflag = spparms('autommd');

spparms('autommd',);

s=b/c;

spparms('autommd',mmdflag);

% construct piecewise cubic Hermite interpolant

% to values and computed slopes

pp = pwch(x,y,s,dx,divdif); pp.dim = sizey;

end

if nargin==, output = pp; else output = ppval(pp,xx); end

chckxy.m

function [x,y,sizey,endslopes] = mychckxy(x,y)

%CHCKXY check and adjust input for SPLINE and PCHIP

% [X,Y,SIZEY] = CHCKXY(X,Y) checks the data sites X and corresponding data

% values Y, making certain that there are exactly as many sites as values,

% that no two data sites are the same, removing any data points that involve

% NaNs, reordering the sites if necessary to ensure that X is a strictly

% increasing row vector and reordering the data values correspondingly,

% and reshaping Y if necessary to make sure that it is a matrix, with Y(:,j)

% the data value corresponding to the data site X(j), and with SIZEY the

% actual dimensions of the given values.

% This call to CHCKXY is suitable for PCHIP.

%

% [X,Y,SIZEY,ENDSLOPES] = CHCKXY(X,Y) also considers the possibility that

% there are two more data values than there are data sites.

% If there are, then the first and the last data value are removed from Y

% and returned separately as ENDSLOPES. Otherwise, an empty ENDSLOPES is

% returned. This call to CHCKXY is suitable for SPLINE.

%

% See also PCHIP, SPLINE.

% Copyright - The MathWorks, Inc.

% make sure X is a vector:

if length(find(size(x)>))>

error(message('MATLAB:chckxy:XNotVector'))

end

% ensure X is real

if any(~isreal(x))

error(message('MATLAB:chckxy:XComplex'))

end

% deal with NaN's among the sites:

nanx = find(isnan(x));

if ~isempty(nanx)

x(nanx) = [];

warning(message('MATLAB:chckxy:nan'))

end

n=length(x);

if n<

error(message('MATLAB:chckxy:NotEnoughPts'))

end

% re-sort, if needed, to ensure strictly increasing site sequence:

x=x(:).';

dx = diff(x);

if any(dx

if ~all(dx), error(message('MATLAB:chckxy:RepeatedSites')), end

% if Y is ND, reshape it to a matrix by combining all dimensions but the last:

sizey = size(y);

while length(sizey)>&&sizey(end)==, sizey(end) = []; end

yn = sizey(end);

sizey(end)=[];

yd = prod(sizey);

if length(sizey)>

y = reshape(y,yd,yn);

else

% if Y happens to be a column matrix, change it to the expected row matrix.

if yn==

yn = yd;

y = reshape(y,,yn);

yd = ;

sizey = yd;

end

end

% determine whether not-a-knot or clamped end conditions are to be used:

nstart = n+length(nanx);

if yn==nstart

endslopes = [];

elseif nargout==&&yn==nstart+

endslopes = y(:,[ n+]); y(:,[ n+])=[];

if any(isnan(endslopes))

error(message('MATLAB:chckxy:EndslopeNaN'))

end

if any(isinf(endslopes))

error(message('MATLAB:chckxy:EndslopeInf'))

end

else

error(message('MATLAB:chckxy:NumSitesMismatchValues',nstart, yn))

end

% deal with NaN's among the values:

if ~isempty(nanx)

y(:,nanx) = [];

end

y=y(:,ind);

nany = find(sum(isnan(y),));

if ~isempty(nany)

y(:,nany) = []; x(nany) = [];

warning(message('MATLAB:chckxy:IgnoreNaN'))

n = length(x);

if n<

error(message('MATLAB:chckxy:NotEnoughPts'))

end

end

67d0865f17d9be527254bf8a8ff6c5b4.gif

function [x,y,sizey,endslopes] = mychckxy(x,y)

%CHCKXY check and adjust input for SPLINE and PCHIP

% [X,Y,SIZEY] = CHCKXY(X,Y) checks the data sites X and corresponding data

% values Y, making certain that there are exactly as many sites as values,

% that no two data sites are the same, removing any data points that involve

% NaNs, reordering the sites if necessary to ensure that X is a strictly

% increasing row vector and reordering the data values correspondingly,

% and reshaping Y if necessary to make sure that it is a matrix, with Y(:,j)

% the data value corresponding to the data site X(j), and with SIZEY the

% actual dimensions of the given values.

% This call to CHCKXY is suitable for PCHIP.

%

% [X,Y,SIZEY,ENDSLOPES] = CHCKXY(X,Y) also considers the possibility that

% there are two more data values than there are data sites.

% If there are, then the first and the last data value are removed from Y

% and returned separately as ENDSLOPES. Otherwise, an empty ENDSLOPES is

% returned. This call to CHCKXY is suitable for SPLINE.

%

% See also PCHIP, SPLINE.

% Copyright 1984-2011 The MathWorks, Inc.

% make sure X is a vector:

if length(find(size(x)>1))>1

error(message('MATLAB:chckxy:XNotVector'))

end

% ensure X is real

if any(~isreal(x))

error(message('MATLAB:chckxy:XComplex'))

end

% deal with NaN's among the sites:

nanx = find(isnan(x));

if ~isempty(nanx)

x(nanx) = [];

warning(message('MATLAB:chckxy:nan'))

end

n=length(x);

if n<2

error(message('MATLAB:chckxy:NotEnoughPts'))

end

% re-sort, if needed, to ensure strictly increasing site sequence:

x=x(:).';

dx = diff(x);

if any(dx<0), [x,ind] = sort(x); dx = diff(x); else ind=1:n; end

if ~all(dx), error(message('MATLAB:chckxy:RepeatedSites')), end

% if Y is ND, reshape it to a matrix by combining all dimensions but the last:

sizey = size(y);

while length(sizey)>2&&sizey(end)==1, sizey(end) = []; end

yn = sizey(end);

sizey(end)=[];

yd = prod(sizey);

if length(sizey)>1

y = reshape(y,yd,yn);

else

% if Y happens to be a column matrix, change it to the expected row matrix.

if yn==1

yn = yd;

y = reshape(y,1,yn);

yd = 1;

sizey = yd;

end

end

% determine whether not-a-knot or clamped end conditions are to be used:

nstart = n+length(nanx);

if yn==nstart

endslopes = [];

elseif nargout==4&&yn==nstart+2

endslopes = y(:,[1 n+2]); y(:,[1 n+2])=[];

if any(isnan(endslopes))

error(message('MATLAB:chckxy:EndslopeNaN'))

end

if any(isinf(endslopes))

error(message('MATLAB:chckxy:EndslopeInf'))

end

else

error(message('MATLAB:chckxy:NumSitesMismatchValues',nstart, yn))

end

% deal with NaN's among the values:

if ~isempty(nanx)

y(:,nanx) = [];

end

y=y(:,ind);

nany = find(sum(isnan(y),1));

if ~isempty(nany)

y(:,nany) = []; x(nany) = [];

warning(message('MATLAB:chckxy:IgnoreNaN'))

n = length(x);

if n<2

error(message('MATLAB:chckxy:NotEnoughPts'))

end

end

67d0865f17d9be527254bf8a8ff6c5b4.gif

ps:说明下,由于这两个文件都是matlab的工具文件,所以chckxy.m在调用时,改了名字叫做mychckxy.m,相应的文件名字也需要改。

做一个简单的测试,做一个调用:

67d0865f17d9be527254bf8a8ff6c5b4.gif

clc;

clear all;

close all;

x = 0:10;

y = sin(x);

xx = 0:.25:10;

yy = spline(x,y,xx)

plot(x,y,'o',xx,yy);

67d0865f17d9be527254bf8a8ff6c5b4.gif

运行结果:

e2425dd1af5abd3a9c670b9ed74474e9.png

259026272bd62f4be7c71ac74682c3ec.png

到此为止,都是准备工作做,下面开始介绍如何在vs中调用spline函数。

1)在matlab中输入命令 mbuild -setup , 运行结果如下图所示, 按照提示选择编译器 vs2010.

mbuild -setup

af4bf752b532d0628dc36a6e47a0c3e7.png

然后键入:mex -setup 命令,运行结果如下图所示,按照提示选择编译器 vs2010

mex -setup

7b32a79d2cc85bef616407fd3d804ca0.png

然后在matlab命令窗口输入:

mcc -W cpplib:libspline -T link:lib spline.m

spline是名字,会根据.m文件的不同而不同!!!

或者输入:mcc -B csharedlib:name name.m

可以得到如下图这些文件:

20e4f49fa7c1f37f3608ca1c23d39acc.png

依然,其中的"libspline.dll"、"libspline.h"和"libspline.lib"这三个文件是我们所需的。

54209e7bc7115b594ed4c01769b1e94e.png

2)打开vs2010建一个控制台应用程序,可以选择一个空的控制台应用程序。

创建程序之后把第一步中得到的三个文件copy到工程中。

cf41df5da5df02ea9f864d5032341b76.png

由于我的电脑是win 7 64bit(win8 64bit),matlab是64bit,所以应该选择x64,而不是win32平台。

a)修改平台参数,为x64

生成 ---> 配置管理器

05c186435442bc980178b5977f6dadd7.png

d6a4a4679d4f7273234f4e6faea2095b.png

b)配置包含目录与库目录

项目 ----> 属性 ----> vc++目录

aad46d73bfbb1b44cb166a4fe23252f3.png

包含目录:

D:\Program Files\MATLAB\R2012a\extern\include

356d649937d0827c2d88094ac4d72855.png

0a97348fffe6d39c1502180d526e8fd1.png

库目录:

D:\Program Files\MATLAB\R2012a\extern\lib\win64\microsoft

089d8c8852298f858cda45bd7ff46680.png

d2d36c0ab16d0d961f3ad00f62d850ec.png

C1)配置附加依赖项

右键MatlabTest解决方案->属性->链接器->输入

在“附加依赖项中”中添加相应的静态链接库文件。对于需要添加的静态库文件的数量和名称,根据需要添加。

libmx.lib

libeng.lib

libmex.lib

libmat.lib

…………

根据需要后续补上。

c2)配置附加依赖项 , 这里根据项目的不同,依赖的文件不同,这里测试依赖的是"mclmcrrt.lib"和"libspline.lib"这两个lib,第一是库lib,第二个是我们生成的lib.文件。所依赖的lib文件在库目录已经说明了,

路径为:D:\Program Files\MATLAB\R2012a\extern\lib\win64\microsoft下。

这里有两种解决方案,第一种在vs中配置。

第一种在vs中配置。建议采用第二种方法!!!!因为第一种不同链接库配置的lib会不一样

项目 ----> 属性 ----> 连接器 ----> 输入

94c7a1502020a5c1bc52323339bfa5d8.png

70a4fa5c38bc6b36dc8f808bc9acaaed.png

第二种方法是,在文件中直接引入lib文件。

6b7fdd5e92ab09835cbf8c80a77c9492.png

做完以上工作后,我们新建一个主函数作为入口函数,具体测试代码如下:

67d0865f17d9be527254bf8a8ff6c5b4.gif

#include "libspline.h" //增加头文件

#include

#include

#include

using namespace std;

#pragma comment(lib,"mclmcrrt.lib")

#pragma comment(lib,"libspline.lib")

int main()

{

//初始化lib(必须)

if (!libsplineInitialize())

return -1;

int i, j;

double x[1][11], y[1][11];

for(i=0; i<11; i++)

{

x[0][i] = i;

y[0][i] = sin(x[0][i]);

}

double xx[1][41];

for(i=0; i<41; i++)

xx[0][i] = i*0.25;

double yy[1][41];

mwArray mwX(1,11,mxDOUBLE_CLASS);

mwArray mwY(1,11,mxDOUBLE_CLASS);

mwArray mwXX(1,41,mxDOUBLE_CLASS);

mwArray mwYY(1,41,mxDOUBLE_CLASS);

mwX.SetData(*x, 11);

mwY.SetData(*y, 11);

mwXX.SetData(*xx, 41);

mwYY.SetData(*yy, 41);

spline(1, mwYY, mwX, mwY, mwXX); //调用spline

cout<

i = 0;

for(j = 0; j < 41; j++)

{

//Get第一个参数表示用1个下标访问元素,j+1是列号(MATLAB下标从1开始,而C++从0开始,故做+1操作)

yy[0][j] = mwYY.Get(1,j+1);

cout<

i++;

if(i%7 == 0) cout<

}

cout<

//终止调用

libsplineTerminate();

return 0;

}

67d0865f17d9be527254bf8a8ff6c5b4.gif

运行结果如图:

66c1baa5243a5fbf179973c8df80ae16.png

比较这个结果与最开始我们测试matlab运行的结果,测试通过。matlab配置完成。

ps说明:配置过程中遇到的问题:

配置时经常遇到 LINK2019的错误。这种错误就是典型的lib缺失导入的问题。

main.obj : error LNK2019: 无法解析的外部符号 mclGetMatrix_proxy,该符号在函数 "public: __cdecl mwArray::mwArray(unsigned __int64,unsigned __int64,enum mxClassID,enum mxComplexity)" (??0mwArray@@QEAA@_K0W4mxClassID@@W4mxComplexity@@@Z) 中被引用

1>main.obj : error LNK2019: 无法解析的外部符号 mclcppGetLastError_proxy,该符号在函数 "public: static void __cdecl mwException::raise_error(void)" (?raise_error@mwException@@SAXXZ) 中被引用

1>main.obj : error LNK2019: 无法解析的外部符号 mclcppCreateError_proxy,该符号在函数 "public: __cdecl mwException::mwException(void)" (??0mwException@@QEAA@XZ) 中被引用

1>main.obj : error LNK2019: 无法解析的外部符号 ref_count_obj_addref_proxy,该符号在函数 "public: __cdecl mwException::mwException(class mwException const &)" (??0mwException@@QEAA@AEBV0@@Z) 中被引用

1>main.obj : error LNK2019: 无法解析的外部符号 ref_count_obj_release_proxy,该符号在函数 "public: virtual __cdecl mwException::~mwException(void)" (??1mwException@@UEAA@XZ) 中被引用

1>main.obj : error LNK2019: 无法解析的外部符号 error_info_get_message_proxy,该符号在函数 "public: virtual char const * __cdecl mwException::what(void)const " (?what@mwException@@UEBAPEBDXZ) 中被引用

1>main.obj : error LNK2019: 无法解析的外部符号 array_ref_getV_int_proxy,该符号在函数 "public: class mwArray __cdecl mwArray::GetPromoted(unsigned __int64,...)" (?GetPromoted@mwArray@@QEAA?AV1@_KZZ) 中被引用

1>main.obj : error LNK2019: 无法解析的外部符号 array_ref_set_numeric_mxDouble_proxy,该符号在函数 "public: void __cdecl mwArray::SetData(double *,unsigned __int64)" (?SetData@mwArray@@QEAAXPEAN_K@Z) 中被引用

1>main.obj : error LNK2019: 无法解析的外部符号 array_ref_get_numeric_mxDouble_proxy,该符号在函数 "public: __cdecl mwArray::operator double(void)const " (??BmwArray@@QEBANXZ) 中被引用

这里是因为缺少:mclmcrrt.lib

#pragma comment(lib,"mclmcrrt.lib")

即可解决。

算法库:Matlab与C&plus;&plus;混合编程

算法库:Matlab与C++混合编程 最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程.在同事Matlab2014的环境下,程序到是一下就运行通过了.但在我这Matlab2 ...

Matlab与&period;NET混合编程解决人脸识别问题

原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...

【目录】Matlab和C&num;混合编程文章目录

本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.Matlab和C#混合编程文章目录 9.接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点 8.国内第一 ...

Matlab与C&plus;&plus;混合编程(依赖OpenCV)

Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...

matlab与vs混合编程&sol;matlab移植

前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...

matlab和c&plus;&plus;混合编程---matlab和vs的环境配置问题及方法和步骤(转载)

matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...

&lbrack;转&rsqb; Matlab与C&plus;&plus;混合编程(依赖OpenCV)

作者 zouxy09@qq.com,原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的M ...

&lbrack;转&rsqb; Matlab与C&plus;&plus;混合编程,添加OpenCV库

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值