/// <summary> /// 获取时空权重矩阵 /// </summary> /// <returns></returns> public double[,] GetTimeDisMatr(MatrType matrType) { int iLength = ZDCount * SJCount; double[,] matr = new double[iLength, iLength]; double[,] disMatr = matrType == MatrType.Complete ? disMatrA : disMatrB; for (int i = 0; i < iLength; i++) { for (int j = 0; j < iLength; j++) { int ZD1 = i / SJCount; int ZD2 = j / SJCount; int SJ1 = i % SJCount; int SJ2 = j % SJCount; matr[i, j] = disMatr[ZD1, ZD2] * timeMatr[SJ1, SJ2]; } } return matr; }
/// <summary> /// 空间权重矩阵计算 /// </summary> /// <param name="dtZDLocation"></param> /// <param name="type"></param> /// <param name="lambda"></param> /// <returns></returns> private static double[,] GetZDDistanceMatrix(DataTable dtZDLocation, MatrType type, double lambda) { DataView dv = dtZDLocation.DefaultView; dv.Sort = s_DICMATR_ZDDM + " asc"; DataTable dt = dv.ToTable(); int iCount = dt.Rows.Count; double[,] matr = new double[iCount, iCount]; for (int i = 0; i < iCount; i++) { DataRow drI = dt.Rows[i]; double xi = (double)drI[s_DICMATR_X] / 1000; double yi = (double)drI[s_DICMATR_Y] / 1000; for (int j = 0; j < iCount; j++) { DataRow drJ = dt.Rows[j]; double xj = (double)drJ[s_DICMATR_X] / 1000; double yj = (double)drJ[s_DICMATR_Y] / 1000; double dis = Math.Sqrt((xi - xj) * (xi - xj) + (yi - yj) * (yi - yj)); matr[i, j] = Math.Exp(-dis / lambda); } } if (type == MatrType.Complete) { for (int i = 0; i < iCount; i++) { matr[i, i] = 0; } } return matr; }