Esempio n. 1
0
 /// <summary>
 /// 等于
 /// </summary>
 /// <param name="other"></param>
 /// <returns></returns>
 public bool Equals(SymmetricMatrix other)
 {
     return(MatrixUtil.IsEqual(this._vector, other._vector, Tolerance));
 }
Esempio n. 2
0
        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);
        }