C# 方法,将“this”作为引用而不是其值传递

C# 方法,将“this”作为引用而不是其值传递,c#,numerical-methods,C#,Numerical Methods,我正在尝试使用QR分解和Givens旋转将二维矩阵转换为其三角形表示。但是,当我尝试传递类Matrixx的对象的值时,它会以某种方式传递其在内存中的位置,从而在转换新矩阵时导致原始矩阵发生变化。我知道下面的代码是非常低效和混乱的,但首先我想在尝试其他任何东西之前让它工作起来 public Matrixx MakeTriangular() { var watch = System.Diagnostics.Stopwatch.StartNew(); int l

我正在尝试使用QR分解和Givens旋转将二维矩阵转换为其三角形表示。但是,当我尝试传递类Matrixx的对象的值时,它会以某种方式传递其在内存中的位置,从而在转换新矩阵时导致原始矩阵发生变化。我知道下面的代码是非常低效和混乱的,但首先我想在尝试其他任何东西之前让它工作起来

public Matrixx MakeTriangular()
    {
        var watch = System.Diagnostics.Stopwatch.StartNew();
        int lines = this.DimI - 1;
        int dimj = this.DimJ;
        double r, s, c;
        Matrixx matrix = new Matrixx(this.DimI, this.DimJ);
        //  instead of 
        //  matrix = this; (which i would like to do)
        //  i have to pass each value seperately
        for (int x = 0; x < DimI; x++)
        {
            for (int y = 0; y < DimJ; y++)
            {
                matrix[x, y] = this[x, y];
            }
        } 
        for (int i = 1; i < lines + 1; i++) // i-te Zeile
        {
            for (int k = 0; k <= i - 1; k++) //k-te Spalte
            {
                if (Math.Abs(matrix[i,k]) > 0.000000001)
                {
                    for (int q = 0; q < DimI; q++)
                    {
                        for (int w = 0; w < DimJ; w++)
                        {
                            this[q, w] = matrix[q, w];
                        }
                    }
                    //Erstellen der Gik-Matrix
                    var Gik = new double[DimJ, DimJ];
                    r = Math.Sqrt(Math.Pow(this[k, k], 2) + Math.Pow(this[i, k], 2));
                    c = this[k, k] / r;
                    s = this[i, k] / r;
                    for (int tempi = 0; tempi < DimJ; tempi++)
                    {
                        for (int tempj = 0; tempj < DimJ; tempj++)
                        {
                            if (tempi == tempj)
                            { Gik[tempi, tempj] = 1; }
                            else
                            { Gik[tempi, tempj] = 0; }
                        }
                    }// Gik = Einheitsmatrix
                    for (int j = 0; j <= DimJ; j++)
                    {
                        for (int l = 0; l <= DimJ; l++)
                        {
                            if (j == i & l == i) Gik[j, l] = c;
                            if (j == k & l == k) Gik[j, l] = c;
                            if (j == k & l == i) Gik[j, l] = s;
                            if (j == i & l == k) Gik[j, l] = -s;
                        }
                    }// Ersetzen der Elemente [i,i], [i,k], [k,i] und [k,k]
                    for (int m = 0; m < DimI; m++)
                    {
                        for (int n = 0; n < DimJ; n++)
                        {
                            double temp = 0;
                            for (int o = 0; o < DimI; o++)
                            {
                                temp += Gik[m, o] * this[o, n];
                            }
                            matrix[m, n] = temp;
                        }
                    }
                }
            }
        }
        return matrix;
    }

通过缩短代码并将方法从我的类Matrixx移动到我需要它的主窗体,修复了这个问题

private static Matrixx Triangularize(Matrixx A)
    {
        var result = A;
        for (var i = 1; i < A.DimI; i++)
        {
            for (var k = 0; k <= i - 1; k++)
            {
                if (!(Math.Abs(result[i, k]) > 0.000000001)) continue;
                var gik = new Matrixx(A.DimJ, A.DimJ);
                var r = Math.Sqrt(Math.Pow(result[k, k], 2) + Math.Pow(result[i, k], 2));
                var c = result[k, k] / r;
                var s = result[i, k] / r;
                for (var z = 0; z < A.DimJ; z++)
                {
                    gik[z, z] = 1;
                    for (var y = 0; y < A.DimJ; y++)
                    {
                        if (z == i & y == i) gik[z, y] = c;
                        if (z == k & y == k) gik[z, y] = c;
                        if (z == k & y == i) gik[z, y] = s;
                        if (z == i & y == k) gik[z, y] = -s;
                    }
                }
                result = Multiplication(gik, result);
            }
        }
        return result;

编辑:欢迎任何优化建议

你是说你想复制现有的矩阵吗?相关吗?对不起,这太吵了。你能创建一个矩阵吗?这个[q,w]=矩阵[q,w];大声喊叫。你为什么会认为这是一个好主意,或者自己看不到这一点,这很难猜测。代码是如何混乱的?@HansPassant对不起,但我只是为有趣的物理专业编程。我真的不知道为什么在这种情况下那条线会很糟糕。