class 中的方法,将 "this" 作为参考而不是其值传递
Method inside a class, passes "this" as reference and not its value
我正在尝试使用 QR 分解和 Givens 旋转将二维矩阵转换为其三角形表示。但是,当我尝试传递我的 class 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;
}
通过缩短代码并将方法从我的 class 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;
编辑:非常欢迎任何优化建议!
我正在尝试使用 QR 分解和 Givens 旋转将二维矩阵转换为其三角形表示。但是,当我尝试传递我的 class 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;
}
通过缩短代码并将方法从我的 class 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;
编辑:非常欢迎任何优化建议!