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