计量地理-PrincipalCA主成分析

el/2024/2/26 0:17:50

输入如下:

9

1 -0.8140 -0.2168 0.3355 -0.186 0.5417 0.4237 0.0378 -0.6547
-0.8140 1 0.4602 -0.6613 -0.0874 -0.7306 -0.3136 -0.0634 0.8749
-0.2168   0.4602 1 0.6603 -0.2394 -0.5314 -0.2072 0.0269 0.6853
0.3355   -0.6613 -0.6603 1 0.3829 0.6197 0.1886 0.0821 -0.7013
-0.1860   -0.0874 -0.2394 0.3829 1 0.0998 -0.1522 0.0471 -0.1322
0.5417   -0.7306 -0.5314 0.6197 0.0998 1 0.279 -0.1118 -0.7764
0.4237   -0.3136 -0.2072 0.1886 -0.1522 0.279 1 0.1408 -0.3658
0.0378   -0.0634 0.0269 0.0821 0.0471 -0.1118 -0.1408 1 -0.0126

-0.6547   0.87490 0.6853 -0.7013 -0.1322 -0.7764 -0.3658 -0.0126 1


第一行为维度

// ShortestRoute.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <malloc.h>
#include <stdlib.h>#include <vector>
using namespace std;float JudgeMin(float a,float b1,float b2)
{if(b2<0)return a;else{if(a<0)return b1+b2;else{if(a<b1+b2)return a;elsereturn b1+b2;}//else}	//else
}void _tmain(int argc, _TCHAR* argv[])
{int iNO = 0;		// 循环次数int iRow,iCol;	// 矩阵行、列数char m_file[] = "图3-10.txt";typedef struct LIST{float *fM;		// 存储M值int iCurPt;		// 当前点LIST* pChild;LIST* pParent;};bool* blTransverse;		// 标识点是否已经转变为P标号点int iStart,iEnd;			// 最短路径的起点、终点bool blExit = false;	// 判断循环是否退出float** m_data;				// 存储原始数据矩阵int ptCur;						// 当前循环计算的起点点号LIST* listH = new LIST;	// 头指针LIST* listE;	// 尾指针// 读文件FILE *fp;if((fp = fopen(m_file,"r")) == NULL){printf("can not open this file\n");return;};fscanf(fp,"%d %d",&iRow,&iCol);//动态定义原始数据m_data = (float**)malloc(sizeof(m_data) * iRow);for(int i = 0;i < iRow;i++)m_data[i] = (float*)malloc(sizeof(m_data) * iCol);listH->fM = new float[iRow - 1];blTransverse = new bool[iRow - 1];for(int i = 0;i < iRow;i++){listH->fM[i] = -1.0;blTransverse[i] = false;}int i = 0,j = 0;while(!feof(fp)){fscanf(fp, "%f", &m_data[i][j]);		j++;if(j == iCol){i++;			j=0;}}	fclose(fp);//选择最短路径的起点和终点printf("Please input start point(>=1), iStart = ");scanf("%d",&iStart);printf("\nPlease input end point(<=7), iEnd = ");scanf("%d",&iEnd);listH->iCurPt = iStart;listH->pParent = NULL;listH->pChild  = NULL;listH->fM[iStart - 1] = 0.0;blTransverse[iStart - 1] = true;ptCur = iStart;LIST* listCur = listH;LIST* listChild;while(!blExit){blExit = true;//对每一个点在循环之前,判断是否所有点都变为固定标号for(int i = 0;i < iRow;i++){if(!blTransverse[i]){blExit = false;break;}}if(blExit)			continue;iNO++;// 对于每一个顶点进行循环,计算以当前标记点到其它点之间的距离for(int i = 0;i < iRow;i++){if(!blTransverse[i]){		// 是否已经被遍历float temp = JudgeMin(listCur->fM[i],listCur->fM[ptCur - 1],m_data[ptCur - 1][i]);listCur->fM[i] = temp;}}// 寻找最小值所对应的点号bool blExist = false;			// 下次循环是否存在点float temp = 99999999999;for(int i = 0;i < iRow;i++){			if(!blTransverse[i]){if(temp > listCur->fM[i] && listCur->fM[i] > 0){temp = listCur->fM[i];ptCur = i + 1;					blExist = true;}}			}// 若存在点,则分配空间;否则,退出循环if(blExist){listChild = new LIST;	}else{printf("Cannot arrive at some point\n");break;}if(listChild){listChild->pChild = NULL;listChild->fM = new float[iRow - 1];for(int i = 0;i < iRow;i++)listChild->fM[i] = listCur->fM[i];blTransverse[ptCur - 1] = true;listChild->iCurPt = ptCur;listChild->pParent = listCur;listCur->pChild = listChild;listCur = listCur->pChild;}}// 确定链表的长度LIST* pBake = listH;int iLength = 0;while(listH->pChild != NULL){listH = listH->pChild;iLength++;}	listH = pBake;listE = listCur;if(listH->pChild == NULL)		iLength = 1;printf("循环次数是:%d;链表长度是:%d\n",iNO,iLength);// 开始从后向前确定最短路径float** m_dist = new float*[iLength];for(int i = 0;i < iLength;i++)m_dist[i] = new float[iRow];int* ptCurList = new int[iLength];int m = 0;while(listH->pChild != NULL){		for(int n = 0;n < iRow;n++){m_dist[m][n] = listH->fM[n];}ptCurList[m] = listH->iCurPt;listH = listH->pChild;m++;}	listH = pBake;vector <int> ptVect;ptVect.push_back(iEnd);ptCur = iEnd;blExit = false;// 首先判断终点是否有值,如果没有则表示无法到达if(m_dist[iLength - 1][ptCur - 1] < 0){printf("Cannot arrive at the end point\n");		system("pause");return;}for(int i = iLength - 1;i >= 0;i--){for(int j = iLength - 2;j >= 0;j--){if(m_dist[i][ptCur - 1] < m_dist[j][ptCur - 1] && m_dist[j][ptCur - 1] > 0){ptCur = ptCurList[i - 1];		// 这个是关键ptVect.push_back(ptCur);i = j;j = iLength - 2;}if(m_dist[j][ptCur - 1] < 0){ptCur = ptCurList[j + 1];ptVect.push_back(ptCur);}}}ptVect.push_back(iStart);// 输出路径printf("最短路径是:\n");	for(int i = ptVect.size() - 1;i >= 0;i--){printf("%d ",ptVect[i]);if(i != 0)		printf("-> ");}// 释放链表while(listE->pParent != NULL){LIST* temp = listE;listE = listE->pParent;listE->pChild = NULL;delete temp;		}	system("pause");
}


http://www.ngui.cc/el/4465888.html

相关文章

计量地理-最优点的位置

输入如下&#xff1a;每一行是居民点位置和人口数 5 5 2 10 10 2.5 5 35 2 10 27.5 2.5 15 5 2 15 15 3 15 40 2 17.5 25 3.5 20 15 4 25 30 4 25 45 2 30 10 4 35 20 5 40 5 3 42.5 25 6 45 35 5 52.5 42.5 5.5 55 35 4.5 55 5 4 57.5 10…

C#-交互式绘图

结果如图所示&#xff1a; using System;using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Windows.Forms;namespace 交互式绘…

测绘-编写数字高程模型(DEM)内插程序

一、 实习目的 掌握移动曲面法数字高程模型内插原理及其内插子程序的设计方法&#xff0c;了解其它逐点高程内插方法的基本原理。 二、 实习内容 根据提供的10个数据点的坐标&#xff08;Xn,Yn,Zn&#xff09;和待求点的平面坐标&#xff08;Xp,Yp&#xff09;&#xff0…

C-链表

上图为效果图 #include <stdio.h>#include <stdlib.h> #include <malloc.h> typedef struct Node{ int data;struct Node *next;} SLIST;void inlist(SLIST *l,int a){SLIST *p,*q;int i;p(SLIST *)malloc(sizeof(SLIST));l->nextp;for(ia;i&…

获取MFC主框架

在MainFrm里面定义的是主框架的东西&#xff0c;也就是一启动就会运行的&#xff0c;所以在后面要加东西的话得获得一开始定义的框架 CMainFrame* pFrame (CMainFrame*)AfxGetApp()->m_pMainWnd; pFrame->m_wndFileView.FillFileView(); MFC一个程序只会有一个从头到尾的…

C++ listCtrl点击列头自动排序

一个函数; void CDialogTableSum::OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult) {NM_LISTVIEW* pNMListView (NM_LISTVIEW*)pNMHDR;int selectcol pNMListView->iSubItem;//获得当前所选列int listcount;//总行数listcount m_listCtrl->GetItemCount();CString t…

C++-MFC Office风格的界面,ListCtrl点击选中后高亮

一个函数就可以搞定&#xff1a; void CListCtrlView::OnCustomdrawList( NMHDR *pNMHDR, LRESULT *pResult ) {NMLVCUSTOMDRAW* pLVCD reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );*pResult CDRF_DODEFAULT;if ( CDDS_PREPAINT pLVCD->nmcd.dwDrawStage ){*pRes…

MFC Office风格的界面,在下图红色部分创建一个listCtrl,是在view里面直接创建,不是写死坐标

只要一步&#xff0c;在View文件里面&#xff0c;新建一个函数&#xff0c;然后把他创建就行了 代码如下&#xff1a;m_listCtrl new CListCtrl;//新建CRect rectDlg;this->GetClientRect(rectDlg);//这两句是获得整个活动窗口的大小m_listCtrl->Create(LVS_REPORT |WS_…

C++MFC Office风格的界面,修改状态栏信息

参考网址&#xff1a;点击打开链接首先&#xff0c;要使用到两个文件&#xff0c;一个是MainFrm&#xff0c;一个是你自己命名的那一组里面带View的那个文件。 其次按如下步骤&#xff1a; 1. 在View里面要创建一个函数&#xff0c;可以是点击事件函数&#xff0c;也可以是别的…

C++ 路径问题

程序.exe的路径&#xff1a; CString strPath; GetModuleFileName( NULL, strPath.GetBuffer(MAX_PATH), MAX_PATH ); //NULL 返回应用程序的全路径strPath.ReleaseBuffer(); //清空缓冲区strPath strPath.Left(strPath.ReverseFind(_T(\\))); //获取整个路径 获取程序的工…