C#,码海拾贝(33)——约化“一般实矩阵”为“赫申伯格矩阵”的“初等相似变换法”之C#源代码

C#,码海拾贝(33)——约化“一般实矩阵”为“赫申伯格矩阵”的“初等相似变换法”之C#源代码_第1张图片

using System;

namespace Zhou.CSharp.Algorithm
{
    ///


    /// 矩阵类
    /// 作者:周长发
    /// 改进:深度混淆
    /// https://blog.csdn.net/beijinghorn
    ///

    public partial class Matrix
    {

        ///


        /// 约化一般实矩阵为赫申伯格矩阵的初等相似变换法
        ///

        /// 源矩阵
        public static void MakeHberg(Matrix src)
        {
            int i = 0, j, k, u, v;
            double d, t;

            for (k = 1; k <= src.Columns - 2; k++)
            {
                d = 0.0;
                for (j = k; j <= src.Columns - 1; j++)
                {
                    u = j * src.Columns + k - 1;
                    t = src[u];
                    if (Math.Abs(t) > Math.Abs(d))
                    {
                        d = t;
                        i = j;
                    }
                }

                if (Math.Abs(d) > float.Epsilon) //d != 0.0)
                {
                    if (i != k)
                    {
                        for (j = k - 1; j <= src.Columns - 1; j++)
                        {
                            u = i * src.Columns + j;
                            v = k * src.Columns + j;
                            t = src[u];
                            src[u] = src[v];
                            src[v] = t;
                        }

                        for (j = 0; j <= src.Columns - 1; j++)
                        {
                            u = j * src.Columns + i;
                            v = j * src.Columns + k;
                            t = src[u];
                            src[u] = src[v];
                            src[v] = t;
                        }
                    }

                    for (i = k + 1; i <= src.Columns - 1; i++)
                    {
                        u = i * src.Columns + k - 1;
                        t = src[u] / d;
                        src[u] = 0.0;
                        for (j = k; j <= src.Columns - 1; j++)
                        {
                            v = i * src.Columns + j;
                            src[v] = src[v] - t * src[k * src.Columns + j];
                        }

                        for (j = 0; j <= src.Columns - 1; j++)
                        {
                            v = j * src.Columns + k;
                            src[v] = src[v] + t * src[j * src.Columns + i];
                        }
                    }
                }
            }
        }
     }

}

你可能感兴趣的:(C#数值计算,Numerical,Recipes,数学建模,servlet)