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, '.') = '\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;
}

#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);
}

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

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

(0)
上一篇 2026年4月15日 下午11:52
下一篇 2026年4月15日 下午11:58


相关推荐

  • dts展开为platform_device结构过程分析

    dts展开为platform_device结构过程分析dts节点展开为platform_device结构过程分析1.概述本文主要是记录学习Linux解析dts的代码分析,以便进行后续回顾。平台:ARMVexpress内核版本:linux-4.92.dts节点展开为platform_device结构过程分析自从ARM引入的dts之后,bsp驱动代码产生了非常之大的变化,像在linux-2.6.32这些版本的platform驱动中,会存在大…

    2022年7月24日
    18
  • 【违禁文】周末两天逛了逛长沙的思考和感悟

    做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!今天不写技术文章了,写一下自己上周末出去逛的体验和感想,本来准备昨天写的,昨天晚上去学习了一个线上的交流活动,搞的时间有点晚,所以周末总结放今天在写一写,因为不写的话,我可能后面也就不会写了,纯粹个人所见所想!人生其实有很多未知,就如我从自己毕业到工作后都没曾想过我会在长沙生活,但是现在已经快两年了,时间过的很快!…

    2022年3月1日
    42
  • 数组转为list java_java arraylist转数组

    数组转为list java_java arraylist转数组java中将数组转为list集合的方法发布时间:2020-10-2809:42:15来源:亿速云阅读:98作者:小新小编给大家分享一下java中将数组转为list集合的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!java中将数组转为list集合的方法:1、使用原生方式,使用for()循环来拆分数组,并添加到List中;2、使用Arrays.asList()方法;3、使用Col…

    2022年8月23日
    5
  • 「镁客·请讲」百融金服张韶峰:为迎接大数据金融的风口,我们已准备了8年…[通俗易懂]

    「镁客·请讲」百融金服张韶峰:为迎接大数据金融的风口,我们已准备了8年…

    2022年3月13日
    47
  • 复杂网络分析工具总结

    复杂网络分析工具总结工具名称 特点 收费 链接 networkx Python 的网络分析的库 优点 用起来比较简单 缺点 是性能不够好 速度慢 不适合处理数据量大的网络 免费 官方网站 http networkx lanl gov igraph C C R 语言 Python 的网络分析库 优点 性能好 效率高 图论和网络分析算法齐全 适合科研 开源 官方网站 http igraph sourcefo

    2026年3月17日
    2
  • uIP学习笔记

    uIP学习笔记1 前言最近半年的时间一直在学习应用嵌入式以太网 虽然学习的动机仅仅是玩玩 但是以太网真的深深吸引了我 这里我和各位分享一下 uIP 的使用经验 uIP 是一个简单好用的嵌入式网络协议栈 易于移植且消耗的内存空间较少 非常适合学习和使用 可以肯定的说 uIP 是嵌入式以太网学习的好起点 但不一定是终点 uIP 的功能远不如 LwIP 强大 但两者并没有孰优孰劣之分 uIP 和 LwIP 的作者同为 Adam

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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