/// <summary> /// 最小二乘误差矩阵 /// [1 0 -y x] /// [0 1 x y] /// </summary> /// <param name="X"></param> /// <returns></returns> private double[,] GetB(double[,] X) { int rowNum = X.GetLength(0); double[,] B = MatrixTool.Init(rowNum, 4); //double[,] M = GetM(); double[,] mi = MatrixTool.Ident(2); //double[,] MK; //MK = specialMulti(M, X); for (int i = 0; i < rowNum; i += 2) { MatrixTool.CopySub(mi, 0, 0, 2, 2, ref B, i, 0); } for (int i = 0; i < rowNum; i += 2) { B[i, 2] = X[i, 0]; B[i, 3] = -X[i + 1, 0]; B[i + 1, 2] = X[i + 1, 0]; B[i + 1, 3] = X[i, 0]; } return(B); }
private double[,] specialSub(double[,] m, double[,] X) { int rowNumM = m.GetLength(0); int colNumM = m.GetLength(1); int rowNumX = X.GetLength(0); int colNumX = X.GetLength(1); int lines = rowNumX / rowNumM; double[,] subX = MatrixTool.Init(rowNumM, colNumX); double[,] res = MatrixTool.Init(rowNumX, colNumX); for (int i = 0; i < rowNumX; i += rowNumM) { MatrixTool.CopySub(X, i, 0, rowNumM, colNumX, ref subX, 0, 0); MatrixTool.Sub(m, subX, ref subX); MatrixTool.CopySub(subX, 0, 0, rowNumM, colNumX, ref res, i, 0); } return(res); }
private double[,] specialMulti(double[,] m, double[,] X) { int rowNumM = m.GetLength(0); int colNumM = m.GetLength(1); int rowNumX = X.GetLength(0); int colNumX = X.GetLength(1); int lines = rowNumX / colNumM; double[,] mt = MatrixTool.Init(rowNumM, colNumX); double[,] subX = MatrixTool.Init(colNumM, colNumX); double[,] res = MatrixTool.Init(rowNumM * lines, colNumX); for (int i = 0; i < lines; i++) { MatrixTool.CopySub(X, i * colNumM, 0, colNumM, colNumX, ref subX, 0, 0); MatrixTool.Multi(m, subX, ref mt); MatrixTool.CopySub(mt, 0, 0, rowNumM, colNumX, ref res, i * rowNumM, 0); } return(res); }