完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本人在matlab下做了一个简单的正态分布拟合函数,根据输入的x,y序列得到mu和sigma的估计值,以及y序列的正态分布曲线拟合序列y1,matlab程序如下:
function [muhat,sigmahat,muci,sigmaci,y1]=normal_fit(x,y) [muhat,sigmahat,muci,sigmaci]=normfit(y); f=fit(x.',y.','gauss1'); y1 = f(x); % y1 = f.a1 * exp(-((x-f.b1)/f.c1).*((x-f.b1)/f.c1)); %% a1=f.a1; %% b1=f.b1; %% c1=f.c1; %% y1 = a1*exp(-((x-b1)/c1).*((x-b1)/c1)); %%% y1 = feval(f,x)'; 将上述函数normal_fit(x,y)编入名为NormalFitClass的类中,生成.Net的dll,NormalFitClass.dll C#调用如下: using NormalFitClass; using MWArray; .... private void do() { double[] x = new double[12] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; double[] y = new double[12] {2, 6, 7, 9, 18, 33, 29, 16, 8, 5, 3, 1}; NormalFitClass.NormalFitClass NFC = new NormalFitClass.NormalFitClass(); MWNumericArray mx = (MWNumericArray)x; MWNumericArray my = (MWNumericArray)y; MWArray[] f = nfc.normal_fit(5, (MWArray)mx, (MWArray)my); } 问题是C#调用的最后一句normal_fit()总是报错, 对于matlab函数中的y1,提示使用cfit错误; 对于matlab函数中%注释的y1,提示使用cfit错误; 对于matlab函数中%%注释的y1,提示使用subsref错误; 对于matlab函数中%%%注释的y1,也提示错误。 我只是想通过fit(x,y,'gauss1')返回一个拟合的高斯曲线,如何可以实现? 附:如果使用muhat和sigmahat值,用1/sqrt(2*pi)/sigmahat*exp(-((x-muhat).*(x-muhat)/2/sigmahat/sigmahat))来计算,所得高斯曲线不能与原y分布一致。 |
|
相关推荐
1个回答
|
|
VS2008与Matlab混合编程之动态链接库
Matlab混合编程方法很多,在此不一一列举,而我直接能想到的就是采用动态链接库的方式。根据网上相关的资料,经过一天的实验,成功在VS环境下调用matlab生成的动态库,实现混合编程。在此简单介绍下过程。 1、配置Matlab。要将Matlab的.m文件生成动态库(DLL),需要对Matlab进行配置,主要有两个命令。 mex -setup mbuild -setup 两个命令的运行过程基本相似,只要根据提示,选择用户需要的编译器环境即可。例如我机器上安装的是VS2008 SP1,则: Select a compiler: [1] Microsoft Visual C++ 2008 SP1 in E:Program Files (x86)Microsoft Visual Studio 9.0 [0] None 选择[1]确定后,即可完成配置。 2、完成自己的.m文件(一般为函数),并将.m文件生成为动态链接库。 在Matlab中完成一个函数文件,命名为add.m,代码如下: function c = add(a, b) c = a + b; 然后将add.m文件编译成C++动态库文件,命令如下: mcc -C -W cpplib:libAdd -T link:lib add.m 其中,libAdd为输出的动态库文件名,add.m为用户代码文件。代码运行完毕后,会生成多个文件,而我们需要的文件只有四个:libAdd.dll libAdd.ctf libAdd.lib libAdd.h。(libAdd.h和libAdd.lib在编译时使用, libAdd.ctf和libAdd.dll在运行时调用 ) 3、配置VS环境。主要是配置Matlab的include files和libraries路径。打开菜单Tools/Options,选择Projects and Solutions/VC++ directories标签页面,根据自己的平台选择Win32/x64, 在show directories for 中选择include files,添加matlab的头文件目录——"matlab安装目录/extern/include"。然后在show directories for 中再选择Library files,添加lib文件的目录——" matlab安装目录/extern/lib/win64/microsoft"(根据自己需要编译程序的平台选择) 4、在VS下建立工程调用生成的动态库。首先为配置工程的依赖项,右击工程选择Properties,选择Linker/Input标签页,在Additional Dependencies中添加所需要的lib库, mclmcrrt.lib,libmx.lb,libmat.lib,libeng.lib这四个为Matlab自带的库,另外将步骤2生成的 libAdd.h和libAdd.lib 拷贝至当前代码目录中,并在 Additional Dependencies中添加 libAdd.lib。 然后在C++代码文件中调用libTest库。在main函数中调用: #include "libAdd.h" int main(int argc, char *argv[]) { if(!mclInitializeApplication(NULL, 0)) { printf("Can not initialize application!n"); return 0; } if (!libAddInitialize()) //该函数是生成库的名字+Initialize():libAddInitialize() { printf("Cann not initialize the library!n"); return 0; } //定义两个matlab矩阵,矩阵类为mwArray mwArray m1(10, 10, mxDOUBLE_CLASS); mwArray m2(10, 10, mxDOUBLE_CLASS); for (int i=1; i<=10; i++) { for (int j=1; j<=10;j++) { m1(j, i) = 10; m2(j, i) = -10; } } //调用函数进行加法运算 mwArray m3; Add(1, m3, m1, m2); //1表示输出参数个数,这里为1个,且输出参数为m3, m1和m2分别表示两个输入矩阵 for (int i=1; i<=10; i++) { printf("n"); for (int j=1; j<=10;j++) { printf("%d ", m3(i,j)); } } } 完成编译后,运行程序会发现找不到相关的DLL,将步骤2生成libTest.dll libTest.ctf拷贝至工作路径下(EXE目录),并在环境变量上设置matlab的bin路径:E:ProgramFilesMATLABR2009abin;E:ProgramFilesMATLABR2009abinwin64。(根据自己的需要设置),设置完毕后,关闭VS,重新打开后便可。该方法只能在安装有Matlab的机器上调用dll,如果在没有安装matlab的机器上使用时,需要首先安装MCRInstaller方可使用。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
使用simulink进行三相短路故障分析时,各参数应该如何设置
1405 浏览 1 评论
想请教一下图中是simulink的什么模块,需要这种三段斜率函数模块但没找到在哪
1505 浏览 1 评论
2425 浏览 1 评论
200圆!求助大佬给一份VSG并网和离网模式的simulink仿真
2690 浏览 0 评论
MATLAB(3)--矩阵的引用(sub2ind、ind2sub、reshape函数使用)
3518 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 20:09 , Processed in 0.593421 second(s), Total 73, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号