【发布时间】:2017-10-31 06:53:11
【问题描述】:
我正在尝试使用 QR 分解和 Givens-Rotations 将二维矩阵转换为其三角形表示。但是,当我尝试传递我的类 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;
}
【问题讨论】:
-
您是说要复制现有矩阵吗? this 相关吗?
-
对不起,这太吵了。你能创建一个minimal reproducible example吗?
-
这个[q, w] = 矩阵[q, w];大声喊叫。为什么你会认为这是一个好主意,或者你自己看不到这一点很难猜测。
-
代码怎么“乱”?
-
@HansPassant 很抱歉,我只是为了好玩而编程(物理专业)。我实际上不知道为什么在这种情况下这条线会不好。
标签: c# numerical-methods