/// <summary> /// 等于 /// </summary> /// <param name="other"></param> /// <returns></returns> public bool Equals(SymmetricMatrix other) { return(MatrixUtil.IsEqual(this._vector, other._vector, Tolerance)); }
public SymmetricMatrix InverseDouble() { int i, j, k; int count = (this.RowCount + 1) * this.RowCount / 2;//阶乘 var inverse = new double[count]; for (i = 0; i < count; i++) //copy { inverse[i] = (this.Vector[i]); ////copy } var dat = new double[this.RowCount]; for (k = 0; k < this.RowCount; k++) { var a00 = inverse[0]; if (a00 == 0) { log.Error("三角阵求逆出错,第一个数字为 0 "); throw new Exception("三角阵求逆出错,第一个数字为 0 "); } for (i = 1; i < RowCount; i++) { var startIndexOfRow = GetStarIndexOfRow(i); var ai0 = inverse[startIndexOfRow]; if (i <= RowCount - k - 1) { dat[i] = -ai0 / a00; } else { dat[i] = ai0 / a00; } for (j = 1; j <= i; j++) { inverse[GetIndex(i - 1, j - 1)] = inverse[GetIndex(i, j)] + ai0 * dat[j]; } } if (RowCount > 500)//并行赋值 { Parallel.For(1, RowCount, new Action <int>(delegate(int ii) { inverse[GetIndex(RowCount - 1, ii - 1)] = dat[ii]; })); } else { for (i = 1; i < RowCount; i++) { inverse[GetIndex(RowCount - 1, i - 1)] = dat[i]; } } inverse[GetIndex(RowCount, -1)] = 1.0 / a00; //最后一个 } var result = new SymmetricMatrix((inverse)); return(result); }