⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lambda.cpp

📁 GPS 定位授时源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

#include "stdafx.h"
//#include "windows.h"
#include "Lambda.h"
#include "fstream.h"
#include "iomanip.h"
#include "math.h"
#include "Lambda.h"
#include "MatrixLYQ.h"
//#include "GlobleDefine.h"



int LAMBDA(MATRIX Qahat, MATRIX aFloat, int nCands, MATRIX & Afixed, MATRIX & SQahatnorm)
{	
	
	MATRIX		Incur(aFloat.nRow,1);
	MATRIX		QahatZ(Qahat.nRow,Qahat.nCol);
	MATRIX		Z(Qahat.nRow,Qahat.nCol);
	MATRIX		L(Qahat.nRow,Qahat.nCol);
	MATRIX		D(Qahat.nRow,Qahat.nCol);
	MATRIX		Zt(Qahat.nRow,Qahat.nCol);
	
	double		dChi2;


	for(int i = 0;i < aFloat.nRow;i ++)
	{
		for(int j = 0;j < aFloat.nCol;j ++)
		{
			Incur.pMATRIX[i][j]  = int(aFloat.pMATRIX[i][j]);
			aFloat.pMATRIX[i][j] = aFloat.pMATRIX[i][j] - Incur.pMATRIX[i][j];
		}
	}

	Decorrel(Qahat,aFloat,QahatZ,Z,L,D,Zt);		        // LtDL-Decomposition
	
	dChi2 = ChiStart(D, L,Zt,nCands);			        // 找出搜索半径

	lSearch(Zt,L, D,dChi2,nCands,Afixed,SQahatnorm);    // 固定出最终的整周模糊度

	
	Afixed	= !(!Afixed * (~Z));	
//CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
	Incur   = RepmatMatrix(Incur,1,nCands);     
	//protend nCands is eQahatual to 1 ,and	negnect this step firstly
	
	for(i = 0;i < Afixed.nRow;i ++)
	{
		for(int j = 0;j < Afixed.nCol;j ++)
		{
			Afixed.pMATRIX[i][j] = Afixed.pMATRIX[i][j] + Incur.pMATRIX[i][j];
			if (Afixed.pMATRIX[i][j] > 0)
			{
				Afixed.pMATRIX[i][j] = int(Afixed.pMATRIX[i][j] + 0.5);
			}
			else
			{
				Afixed.pMATRIX[i][j] = int(Afixed.pMATRIX[i][j] - 0.5);
			}
		}
	}	



	ofstream   out;
	out.open("Fixed Ambiguty.txt",ios::out,filebuf::openprot);
	out<<"Fixed Ambiguity :"<<endl;
	out<<setiosflags(ios::left);
	
	for(i = 0;i < Afixed.nRow;i ++)
	{
		out<<"        ";
		for(int j = 0;j < Afixed.nCol;j ++)
		{
			out<<setw(20)<<setprecision(10);
			out<<Afixed.pMATRIX[i][j];
		}
		out<<endl;
	}
	
	out<<"Qahat.norm :"<<endl;
	out<<setiosflags(ios::left)<<setw(20)<<setprecision(10);
	for(i = 0;i < SQahatnorm.nRow;i ++)
	{
		out<<"        ";
		for(int j = 0;j < SQahatnorm.nCol;j ++)
		{
			out<<setw(20)<<setprecision(10);
			out<<SQahatnorm.pMATRIX[i][j];
		}
		out<<endl;
	}	


//	AfxMessageBox("LAMBDA算法搜索整周模糊度完成,结果保存在Fixed Ambiguty.txt文件中");
    
	return 1;	
}



// **************************************************************************
int Decorrel(MATRIX Qahat, MATRIX aFloat, MATRIX & QahatZ, MATRIX & Z, MATRIX & L, MATRIX & D, MATRIX & Za)
{
	int		nn;
	nn		= Qahat.nRow;   //Qahat矩阵的行数n = size(Qahat,1);
	MATRIX  Zti(nn,nn); //
	int		ni1;
	double	dMu;
	double	dMid;
	int		nSw;
	int		ni;

	for(int i = 0; i < Zti.nRow;i ++)//Zti = eye(n);
	{
		Zti.pMATRIX[i][i]  = 1;
	}

//	nn		= nn - 1; //由于matlab与C 中数组的起始下标不同
	ni1		= nn - 1; //i1 = n -1,
	nSw		= 1;      //只是一个中间变量
	LtDLComposition(Qahat,L,D);//LtDL-decomposition

	while (nSw != 0)
	{
		ni	= Qahat.nRow - 1;//i = n;
		nSw = 0;
		
		while ((!nSw) && (ni > 0))//while (~sw) & (i > 1)
		{
			ni  = ni - 1;//i = i -1;
			if (ni < ni1)//if(i <= i1)
			{
				for(int j = ni + 1; j < nn ; j ++)//for j = i + 1:n
				{
					if (L.pMATRIX[j][ni] > 0)//mu = round(L(j,n))
					{
						dMu		= (int)(L.pMATRIX[j][ni] + 0.5);
					}
					else
					{
						dMu		= (int)(L.pMATRIX[j][ni] - 0.5);
					}

					if (dMu != 0)//if mu ~= 0
					{
						for(int nj = j; nj < nn;nj ++)//L(j:n,i) = L(j:n,i) - mu * L(j:n,j)
						{
							L.pMATRIX[nj][ni] = L.pMATRIX[nj][ni] - dMu * L.pMATRIX[nj][j];

						}
						for(int t = 0;t < nn; t ++)//Zti(1:n,j) = Zti(1:n,j) + mu * Zti(1:n,i);
						{
							Zti.pMATRIX[t][j]	= Zti.pMATRIX[t][j] + dMu * Zti.pMATRIX[t][ni];
						}
					}
		
				}
			}
		
			double	dDelta;
			//delta		= D(i) + L(i+1,i)^2 * D(i + 1)
			dDelta		= D.pMATRIX[ni][ni] + pow(L.pMATRIX[ni + 1][ni],2) * D.pMATRIX[ni + 1][ni + 1];
			
			if (dDelta < D.pMATRIX[ni + 1][ni + 1])       //if(delta < D(i + 1))
			{
				dMid   = D.pMATRIX[ni + 1][ni + 1] * L.pMATRIX[ni + 1][ni] / dDelta;//lambda(3) = D(i + 1) * L(i + 1,i) / delta;
				double dEta;
				dEta		= D.pMATRIX[ni][ni]  / dDelta; //eta     = D(i) / delta;
				D.pMATRIX[ni][ni]	= dEta * D.pMATRIX[ni + 1][ni + 1];//D(i)         = eta * D(i+1);
				D.pMATRIX[ni + 1][ni + 1]	= dDelta;//D(i+1)       = delta;


				MATRIX  Help(ni,1);
				for(int u = 0;u < ni; u ++)
				{
					Help.pMATRIX[u][0]		= L.pMATRIX[ni + 1][u] - L.pMATRIX[ni + 1][ni] * L.pMATRIX[ni][u];// Help         = L(i+1,1:i-1) - L(i+1,i) .* L(i,1:i-1);
					L.pMATRIX[ni + 1][u]	= dMid * L.pMATRIX[ni + 1][u] + dEta * L.pMATRIX[ni][u];// L(i+1,1:i-1) = lambda(3) * L(i+1,1:i-1) + eta * L(i,1:i-1);
					L.pMATRIX[ni][u]		= Help.pMATRIX[u][0];//L(i,1:i-1)   = Help;
				}
				L.pMATRIX[ni + 1][ni]		= dMid;//L(i+1,i)     = lambda(3);
				
				MATRIX Help1(nn - ni-2,1);//
				for(int v = ni + 2,m = 0;v < nn;v++,m ++)//
				{
					Help1.pMATRIX[m][0]  = L.pMATRIX[v][ni];// Help         = L(i+2:n,i);
					L.pMATRIX[v][ni]	 = L.pMATRIX[v][ni + 1];//L(i+2:n,i)   = L(i+2:n,i+1);
					L.pMATRIX[v][ni + 1] = Help1.pMATRIX[m][0];//L(i+2:n,i+1) = Help;
				}

				MATRIX Help2(nn,1);
				for(u= 0;u < nn;u ++)
				{
					Help2.pMATRIX[u][0]	= Zti.pMATRIX[u][ni];//Help         = Zti(1:n,i);
					Zti.pMATRIX[u][ni]  = Zti.pMATRIX[u][ni + 1];//Zti(1:n,i)   = Zti(1:n,i+1);
					Zti.pMATRIX[u][ni + 1] = Help2.pMATRIX[u][0];//Zti(1:n,i+1) = Help;
				}

				ni1		= ni + 1;//i1           = i;
				nSw		= 1;	 //sw           = 1;
			}
		}
	}

	Z	= ~(!Zti);//Z = inv(Zti');//转换矩阵
	for(i = 0;i < Z.nRow;i ++)
	{
		for(int j = 0;j < Z.nCol;j ++)
		{
			if (Z.pMATRIX[i][j] > 0)
			{
				Z.pMATRIX[i][j]  = int(Z.pMATRIX[i][j] + 0.5);
			}
			else
			{
				Z.pMATRIX[i][j]	 = int(Z.pMATRIX[i][j] - 0.5);
			}
			
		}
	}
	QahatZ	= !Z * Qahat * Z; //Qahat = Z' * Qahat * Z;//转换以后的方差-协方差阵
	Za	= !Z * aFloat;     //变换以后的整周模糊度矩阵
	
	return 1;
}
// ******************************************************************************


// ***************************************************************************
double ChiStart(MATRIX D, MATRIX L, MATRIX Afloat, int nCands)
{
	int			nArgin;
	double		dFactor;
	double  dChi2;
	MATRIX  Linv;
	MATRIX  Dinv;
	MATRIX  dist(Afloat.nRow,Afloat.nCol);
	MATRIX Ee;
	double  dMid;
	double  dSortMid;
	int		nTemp;
	nArgin   = 8;
	dFactor  = 0;

	if (nArgin < 4)
	{
		nCands		= 1;
	}
	if (nArgin < 5)
	{
		dFactor		= 1.5;
	}

	int  nN;
	if (Afloat.nRow >= Afloat.nCol)
	{
		nN			= Afloat.nRow;
	}
	else
	{
		nN			= Afloat.nCol;
	}

	if (nCands == 1)
	{
		MATRIX  Afixed;
		MATRIX  AfloatH;
		double   dW;
		Afixed		= Afloat;
		AfloatH		= Afloat;
		for(int i=0;i < nN;i ++)
		{
			dW		= 0;
			for(int j =0;j < nN - 1; j ++)
			{
				dW  += L.pMATRIX[i][j] * (Afloat.pMATRIX[j][0] - Afixed.pMATRIX[j][0]);
			}
			Afloat.pMATRIX[i][0]  = Afloat.pMATRIX[i][0] - dW;
			if(Afloat.pMATRIX[i][0] > 0)
			{
				Afixed.pMATRIX[i][0]  = int(Afloat.pMATRIX[i][0] + 0.5);
			}
			else
			{
								Afixed.pMATRIX[i][0]  = int(Afloat.pMATRIX[i][0] - 0.5);
			}
		}

		MATRIX  Temp(Afixed.nRow,Afixed.nCol);
		for(i = 0;i < Afixed.nRow;i ++)
		{
			for(int j = 0; j < Afixed.nCol; j ++)
			{
				Temp.pMATRIX[i][j] = AfloatH.pMATRIX[i][j] - Afixed.pMATRIX[i][j];
			}
		}
		Temp   = !Temp * (~(!L * D * L)) * Temp;
		dChi2  = Temp.pMATRIX[0][0] + 1E-6;
	}
	else if (nCands <= nN + 1)
	{
		Linv	= ~L;
		Dinv	= ~D;

		for(int i = 0;i < Afloat.nRow;i ++)
		{//取小数部分
			for(int j = 0;j < Afloat.nCol;j ++)
			{
				if (Afloat.pMATRIX[i][j] > 0)
				{
					dMid	= int(Afloat.pMATRIX[i][j] + 0.5);
				}
				else
				{
					dMid    = int(Afloat.pMATRIX[i][j] - 0.5);
				}
				dist.pMATRIX[i][j]	= dMid - Afloat.pMATRIX[i][j];
			}
		}
	
		Ee	= (!Linv) * dist;
		MATRIX  Chi(1,nN + 1);
		double   dSum;
		MATRIX   SUM(1,1);
		SUM		= !(Dinv * Ee) * Ee;
		Chi.pMATRIX[0][nN]		= SUM.pMATRIX[0][0];
		for( i = 0; i < nN; i ++)
		{
			Chi.pMATRIX[0][i] = 0;
			for(int j = 0;j <= i; j ++)
			{
				Chi.pMATRIX[0][i]  = Chi.pMATRIX[0][i] + 
					Dinv.pMATRIX[j][j] * Linv.pMATRIX[i][j] *
					(2 * Ee.pMATRIX[j][0] + Linv.pMATRIX[i][j]);
			}
			Chi.pMATRIX[0][i]	= Chi.pMATRIX[0][nN]  + fabs(Chi.pMATRIX[0][i]);
		}

		for(i = 0;i < Chi.nCol;i ++)
		{
			nTemp	= i;
			for(int j = i + 1;j < Chi.nCol; j ++)
			{
				if(Chi.pMATRIX[0][j] < Chi.pMATRIX[0][nTemp])
				{
					nTemp = j;
				}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -