c语言-lm_LM算法的more1978

c语言-lm_LM算法的more1978#pragmaonce#include#include”opencv2\core\core.hpp”#pragmacomment(lib,”opencv_core248d.lib”)constintMAXTIME=50;usingnamespacecv;FileStoragefs;Matjacobin(constMat&pk/*[a,b]*/,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

这是一个数据拟合的例子,并没有采用面向对象的设计方法是使能更好的理解LM算法的流程,简约而不简单。算法详细过程不多介绍。程序中用到opencv库中的矩阵类Mat。

例:c语言-lm_LM算法的more1978

#pragma  once
#include <stdio.h>
#include "opencv2\core\core.hpp"

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

const int  MAXTIME = 50;

using namespace cv;
FileStorage fs;

Mat jacobin(const Mat& pk/*[a,b]*/, const Mat& x); //f = a*exp(-b*x)
Mat yEstimate(const Mat& p, const Mat& x);
inline void outData(FileStorage& fs, Mat & m, char* filename)
{
	fs.open(filename, FileStorage::FORMAT_XML | FileStorage::WRITE);
	char *temp = new char[10]; 
	strcpy_s(temp, 10,filename); 
	*strchr(temp, '.') = '
#pragma  once
#include <stdio.h>
#include "opencv2\core\core.hpp"
#pragma comment(lib,"opencv_core248d.lib")
const int  MAXTIME = 50;
using namespace cv;
FileStorage fs;
Mat jacobin(const Mat& pk/*[a,b]*/, const Mat& x); //f = a*exp(-b*x)
Mat yEstimate(const Mat& p, const Mat& x);
inline void outData(FileStorage& fs, Mat & m, char* filename)
{
fs.open(filename, FileStorage::FORMAT_XML | FileStorage::WRITE);
char *temp = new char[10]; 
strcpy_s(temp, 10,filename); 
*strchr(temp, '.') = '\0';
fs << temp << m; 
fs.release();
delete[] temp;
}
void LM(double* p0, int pN, double* x, int xN, double* y, double lamda, double step, double ep = 0.0001)
{
int iters = 0;
int updateJ = 1;
double ek = 0.0, ekk = 0.0;//估计误差
Mat_<double> xM(xN, 1, x), yM(xN, 1, y), pM(pN, 1, p0), JM, yEM, yEMM, dM, gM, dMM, dpM;//至少需要JM,gM,dpM,pM
for (; iters < MAXTIME; iters++)
{
if (updateJ == 1)
{
JM = jacobin(pM, xM);
//outData(fs, JM, "J.xml");
yEM = yEstimate(pM, xM);
dM = yM - yEM;
gM = JM.t()*dM;
if (iters == 0)
ek = dM.dot(dM);
//outData(fs, dM, "d.xml");
}
Mat_<double> NM = JM.t()*JM + lamda*(Mat::eye(pN, pN, CV_64F));
if (solve(NM, gM, dpM))
{
Mat_<double> pMM = pM + dpM;
yEMM = yEstimate(pMM, xM);
dMM = yM - yEMM;
ekk = dMM.dot(dMM);
//outData(fs, dMM, "dlm.xml");
//outData(fs, dpM, "dp.xml");
if (ekk < ek)//成功则更新向量与估计误差
{
printf("the %d iterator result\n", iters);
if (dpM.dot(dpM) < ep)
{
outData(fs, pM, "p.xml");
return;
}
else
{
pM = pMM;
ek = ekk;
lamda = lamda / step;
updateJ = 1;
continue;
}
}
else
{
lamda = lamda*step;
updateJ = 0;
}
}
else
{
outData(fs, JM, "badJ.xml");
//return;
}
}
}
Mat jacobin(const Mat& pk/*[a,b]*/, const Mat& x)
{
Mat_<double> J(x.rows, pk.rows), da, db;
exp(-pk.at<double>(1)*x, da);
exp(-pk.at<double>(1)*x, db);
db = -pk.at<double>(0)*x.mul(db);
//outData(fs, da, "da.xml");
//outData(fs, db, "db.xml");
da.copyTo(J(Rect(0, 0, 1, J.rows)));
db.copyTo(J(Rect(1, 0, 1, J.rows)));
return J;
}
Mat yEstimate(const Mat& p, const Mat& x)
{
Mat_<double> Y(x.rows, x.cols);
exp(-p.at<double>(1)*x, Y);
Y = p.at<double>(0)*Y;
return Y;
}
'; fs << temp << m; fs.release(); delete[] temp; } void LM(double* p0, int pN, double* x, int xN, double* y, double lamda, double step, double ep = 0.0001) { int iters = 0; int updateJ = 1; double ek = 0.0, ekk = 0.0;//估计误差 Mat_<double> xM(xN, 1, x), yM(xN, 1, y), pM(pN, 1, p0), JM, yEM, yEMM, dM, gM, dMM, dpM;//至少需要JM,gM,dpM,pM for (; iters < MAXTIME; iters++) { if (updateJ == 1) { JM = jacobin(pM, xM); //outData(fs, JM, "J.xml"); yEM = yEstimate(pM, xM); dM = yM - yEM; gM = JM.t()*dM; if (iters == 0) ek = dM.dot(dM); //outData(fs, dM, "d.xml"); } Mat_<double> NM = JM.t()*JM + lamda*(Mat::eye(pN, pN, CV_64F)); if (solve(NM, gM, dpM)) { Mat_<double> pMM = pM + dpM; yEMM = yEstimate(pMM, xM); dMM = yM - yEMM; ekk = dMM.dot(dMM); //outData(fs, dMM, "dlm.xml"); //outData(fs, dpM, "dp.xml"); if (ekk < ek)//成功则更新向量与估计误差 { printf("the %d iterator result\n", iters); if (dpM.dot(dpM) < ep) { outData(fs, pM, "p.xml"); return; } else { pM = pMM; ek = ekk; lamda = lamda / step; updateJ = 1; continue; } } else { lamda = lamda*step; updateJ = 0; } } else { outData(fs, JM, "badJ.xml"); //return; } } } Mat jacobin(const Mat& pk/*[a,b]*/, const Mat& x) { Mat_<double> J(x.rows, pk.rows), da, db; exp(-pk.at<double>(1)*x, da); exp(-pk.at<double>(1)*x, db); db = -pk.at<double>(0)*x.mul(db); //outData(fs, da, "da.xml"); //outData(fs, db, "db.xml"); da.copyTo(J(Rect(0, 0, 1, J.rows))); db.copyTo(J(Rect(1, 0, 1, J.rows))); return J; } Mat yEstimate(const Mat& p, const Mat& x) { Mat_<double> Y(x.rows, x.cols); exp(-p.at<double>(1)*x, Y); Y = p.at<double>(0)*Y; return Y; }

#include "LMM.h"

int main()
{
	double data[] = { 0.25, 0.5, 1, 1.5, 2, 3, 4, 6, 8 };
	double obs[] = { 19.21, 18.15, 15.36, 14.10, 12.89, 9.32, 7.45, 5.24, 3.01 };
	double p0[] = { 1, 1 };
	LM(p0, 2, data, 9, obs, 0.01, 10);
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/188641.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • MATLAB调用Origin绘图官方案例学习

    MATLAB调用Origin绘图官方案例学习这里写目录标题作为一个化工狗,日常处理实验数据绘图用的都是origin,origin自带的模板和调色板比matlab好看太多(origin9以上,古老版本的origin配色也很丑)。平常都是把数据导出后转至origin处理,偶然看到origin存在COM接口,可以让matlab调用,于是试用了一下。这里把首次使用的全过程po上来,欢迎学习交流~软件版本:MatlabR2019b,Origin2…

  • Ubuntu创建软连接[通俗易懂]

    Ubuntu创建软连接[通俗易懂]Ubuntu创建软连接建立软连接ln-s原目录删除软连接sudorm或者强制删除-rf创建软连接ln-s源地址目的地址列如:Ubuntu文件系统rootfs_dir软连接到/home/lp目录下ln-s/opt/Linux/root_dir/home/lp/roo_dir就OK了…

  • 市场上Web 应用防火墙哪家好?

    市场上Web 应用防火墙哪家好?伴随着移动互联网及互联网的发展,办公自动化也成为大势所趋。当企业通过网络办公获得无限便利后,也要时刻关注潜在的网络安全威胁。为了保护数据安全,更多企业都会配备Web应用防火墙设备。在市场上的Web应用防火墙产品应用中,被Gartner魔力象限评为Web应用防火墙领导者的F5公司的产品受到了广泛的关注与好评。 F5被Gartner魔力象限评为Web应用防火墙领导者F5推出的WEB应用防…

  • java语言代码大全_java语言代码大全解析

    java语言代码大全_java语言代码大全解析Java语言是如今互联网最热门的语言之一,今天我们就来了解一些java语言经常用到的代码,快来看看吧。一、jdbc连接publicclassOracleJdbcTest{StringdriverClass=”oracle.jdbc.driver.OracleDriver”;Connectioncon;publicvoidinit(FileInputStreamfs)throws…

  • painless数字类型转换_painless获取doc字段的方式「建议收藏」

    如果你写painless脚本的时候,发现对不同结构的字段获取有点困惑,那么本文可能会帮助你。取普通字段默认ES会把非text、非nested的字段存到docvalues列存储中,方便单独获取,而不用取_source里取,这样IO性能就很好。假设你有一个字段:”a”:1。那么doc[‘a’]返回的是[1],是一个数组。doc[‘a’].value返回的是1,也就是取第一个元素。doc[‘a’]….

  • vue中splice_vue的computed用法

    vue中splice_vue的computed用法Vuesplice方法使用

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号