public static FloatVector GenerateRow(IFloatMatrix A, int r, int c1, int c2) { int cu = c2 - c1 + 1; FloatVector u = new FloatVector(cu); for (int j = c1; j <= c2; j++) { u[j - c1] = A[r, j]; A[r, j] = 0.0f; } float norm = u.GetNorm(); if (c1 == c2 || norm == 0) { A[r, c1] = -u[0]; u[0] = (float)System.Math.Sqrt(2); return(u); } float scale = 1.0f / norm; if (u[0] < 0.0f) { scale *= -1.0f; } A[r, c1] = -1.0f / scale; for (int j = 0; j < cu; j++) { u[j] *= scale; } u[0] += 1.0f; float s = (float)System.Math.Sqrt(1 / u[0]); for (int j = 0; j < cu; j++) { u[j] *= s; } return(u); }
public static FloatVector GenerateColumn(IFloatMatrix A, int r1, int r2, int c) { int ru = r2 - r1 + 1; FloatVector u = new FloatVector(r2 - r1 + 1); for (int i = r1; i <= r2; i++) { u[i - r1] = A[i, c]; A[i, c] = 0.0f; } float norm = u.GetNorm(); if (r1 == r2 || norm == 0) { A[r1, c] = -u[0]; u[0] = (float)System.Math.Sqrt(2); return(u); } float scale = 1.0f / norm; if (u[0] < 0.0f) { scale *= -1.0f; } A[r1, c] = -1.0f / scale; for (int i = 0; i < ru; i++) { u[i] = u[i] * scale; } u[0] = u[0] + 1.0f; float s = (float)System.Math.Sqrt(1 / u[0]); for (int i = 0; i < ru; i++) { u[i] = s * u[i]; } return(u); }
public static FloatVector GenerateColumn(IFloatMatrix A, int r1, int r2, int c) { int ru = r2 - r1 + 1; FloatVector u = new FloatVector(r2 - r1 + 1); for (int i = r1; i <= r2; i++) { u[i - r1] = A[i, c]; A[i, c] = 0.0f; } float norm = u.GetNorm(); if (r1 == r2 || norm == 0) { A[r1, c] = -u[0]; u[0] = (float)System.Math.Sqrt(2); return u; } float scale = 1.0f / norm; if (u[0] < 0.0f) scale *= -1.0f; A[r1, c] = -1.0f / scale; for (int i = 0; i < ru; i++) { u[i] = u[i] * scale; } u[0] = u[0] + 1.0f; float s = (float)System.Math.Sqrt(1 / u[0]); for (int i = 0; i < ru; i++) { u[i] = s * u[i]; } return u; }
public static FloatVector GenerateRow(IFloatMatrix A, int r, int c1, int c2) { int cu = c2 - c1 + 1; FloatVector u = new FloatVector(cu); for (int j = c1; j <= c2; j++) { u[j - c1] = A[r, j]; A[r, j] = 0.0f; } float norm = u.GetNorm(); if (c1 == c2 || norm == 0) { A[r, c1] = -u[0]; u[0] = (float)System.Math.Sqrt(2); return u; } float scale = 1.0f / norm; if (u[0] < 0.0f) scale *= -1.0f; A[r, c1] = -1.0f / scale; for (int j = 0; j < cu; j++) { u[j] *= scale; } u[0] += 1.0f; float s = (float)System.Math.Sqrt(1 / u[0]); for (int j = 0; j < cu; j++) { u[j] *= s; } return u; }
public void GetNorm() { FloatVector a = new FloatVector(new float[4]{0,1,2,3}); FloatVector b = new FloatVector(new float[4]{4,5,6,7}); Assert.AreEqual(a.GetNorm(),System.Math.Sqrt(14),TOLERENCE); Assert.AreEqual(a.GetNorm(),a.GetNorm(2)); Assert.AreEqual(a.GetNorm(0),3); Assert.AreEqual(b.GetNorm(),3*System.Math.Sqrt(14),TOLERENCE); Assert.AreEqual(b.GetNorm(),b.GetNorm(2)); Assert.AreEqual(b.GetNorm(0),7); }