public static Vector operator -(Vector vector, double val) { Vector vector1 = new Vector(vector.nrows); for (int i = 0; i < vector.nrows; ++i) vector1[i] = vector[i] - val; return vector1; }
public static Vector operator -(Vector target, Vector source) { Vector vector = new Vector(target.nrows); for (int i = 0; i < target.nrows; ++i) vector[i] = target[i] - source[i]; return vector; }
public static Vector operator *(Vector vector, double val) { Vector vector1 = new Vector(vector.nrows); for (int index = 0; index < vector.nrows; ++index) vector1[index] = vector[index] * val; return vector1; }
public void MakeTridiagonal(Matrix a, Vector d, Vector e) { int num1 = a.m; double[] numArray = new double[this.M * this.N]; for (int index = 0; index < this.M * this.N; ++index) numArray[index] = a.Elements[index / this.M, index % this.N]; double[] elements1 = d.Elements; double[] elements2 = e.Elements; for (int index1 = num1 - 1; index1 > 0; --index1) { int num2 = index1 - 1; double d1 = 0.0; double num3 = 0.0; if (num2 > 0) { for (int index2 = 0; index2 <= num2; ++index2) num3 += Math.Abs(numArray[index1 + index2 * num1]); if (num3 == 0.0) { elements2[index1] = numArray[index1 + num2 * num1]; } else { for (int index2 = 0; index2 <= num2; ++index2) { numArray[index1 + index2 * num1] /= num3; d1 += numArray[index1 + index2 * num1] * numArray[index1 + index2 * num1]; } double num4 = numArray[index1 + num2 * num1]; double num5 = num4 < 0.0 ? Math.Sqrt(d1) : -Math.Sqrt(d1); elements2[index1] = num3 * num5; d1 -= num4 * num5; numArray[index1 + num2 * num1] = num4 - num5; double num6 = 0.0; for (int index2 = 0; index2 <= num2; ++index2) { numArray[index2 + index1 * num1] = numArray[index1 + index2 * num1] / d1; double num7 = 0.0; for (int index3 = 0; index3 <= index2; ++index3) num7 += numArray[index2 + index3 * num1] * numArray[index1 + index3 * num1]; for (int index3 = index2 + 1; index3 <= num2; ++index3) num7 += numArray[index3 + index2 * num1] * numArray[index1 + index3 * num1]; elements2[index2] = num7 / d1; num6 += elements2[index2] * numArray[index1 + index2 * num1]; } double num8 = num6 / (d1 + d1); for (int index2 = 0; index2 <= num2; ++index2) { double num7 = numArray[index1 + index2 * num1]; double num9; elements2[index2] = num9 = elements2[index2] - num8 * num7; for (int index3 = 0; index3 <= index2; ++index3) numArray[index2 + index3 * num1] -= num7 * elements2[index3] + num9 * numArray[index1 + index3 * num1]; } } } else elements2[index1] = numArray[index1 + num2 * num1]; elements1[index1] = d1; } elements1[0] = 0.0; elements2[0] = 0.0; for (int index1 = 0; index1 < num1; ++index1) { int num2 = index1 - 1; if (elements1[index1] != 0.0) { for (int index2 = 0; index2 <= num2; ++index2) { double num3 = 0.0; for (int index3 = 0; index3 <= num2; ++index3) num3 += numArray[index1 + index3 * num1] * numArray[index3 + index2 * num1]; for (int index3 = 0; index3 <= num2; ++index3) numArray[index3 + index2 * num1] -= num3 * numArray[index3 + index1 * num1]; } } elements1[index1] = numArray[index1 + index1 * num1]; numArray[index1 + index1 * num1] = 1.0; for (int index2 = 0; index2 <= num2; ++index2) numArray[index2 + index1 * num1] = numArray[index1 + index2 * num1] = 0.0; } for (int index = 0; index < this.M * this.N; ++index) a.Elements[index / this.M, index % this.N] = numArray[index]; }
public Matrix EigenVectors(Vector eigenValues) { Matrix matrix = new Matrix(this.Rows, this.Cols); for (int index1 = 0; index1 < this.Rows; ++index1) { for (int index2 = 0; index2 < this.Cols; ++index2) matrix[index1, index2] = this[index1, index2]; } eigenValues.ResizeTo(this.Rows); Vector e = new Vector(this.Rows); this.MakeTridiagonal(matrix, eigenValues, e); this.MakeEigenVectors(eigenValues, e, matrix); this.EigenSort(matrix, eigenValues); return matrix; }
public void EigenSort(Matrix eigenVectors, Vector eigenValues) { int rows = eigenVectors.Rows; double[] numArray = new double[rows * rows]; for (int index = 0; index < rows * rows; ++index) numArray[index] = eigenVectors.Elements[index / rows, index % rows]; double[] elements = eigenValues.Elements; for (int index1 = 0; index1 < rows; ++index1) { int index2 = index1; double num1 = elements[index1]; for (int index3 = index1 + 1; index3 < rows; ++index3) { if (elements[index3] >= num1) { index2 = index3; num1 = elements[index3]; } } if (index2 != index1) { elements[index2] = elements[index1]; elements[index1] = num1; for (int index3 = 0; index3 < rows; ++index3) { double num2 = numArray[index3 + index1 * rows]; numArray[index3 + index1 * rows] = numArray[index3 + index2 * rows]; numArray[index3 + index2 * rows] = num2; } } } for (int index = 0; index < rows * rows; ++index) eigenVectors.Elements[index / rows, index % rows] = numArray[index]; }
public void MakeEigenVectors(Vector d, Vector e, Matrix z) { int rows = z.Rows; double[] elements1 = d.Elements; double[] elements2 = e.Elements; double[] numArray = new double[rows * rows]; for (int index = 0; index < rows * rows; ++index) numArray[index] = z.Elements[index / rows, index % rows]; for (int index = 1; index < rows; ++index) elements2[index - 1] = elements2[index]; elements2[rows - 1] = 0.0; for (int index1 = 0; index1 < rows; ++index1) { int num1 = 0; int index2; do { for (index2 = index1; index2 < rows - 1; ++index2) { double num2 = Math.Abs(elements1[index2]) + Math.Abs(elements1[index2 + 1]); if (Math.Abs(elements2[index2]) + num2 == num2) break; } if (index2 != index1) { if (num1++ == 30) { this.Error("", ""); return; } else { double num2 = (elements1[index1 + 1] - elements1[index1]) / (2.0 * elements2[index1]); double num3 = Math.Sqrt(num2 * num2 + 1.0); double num4 = elements1[index2] - elements1[index1] + elements2[index1] / (num2 + (num2 >= 0.0 ? Math.Abs(num3) : -Math.Abs(num3))); double num5 = 1.0; double num6 = 1.0; double num7 = 0.0; int index3; for (index3 = index2 - 1; index3 >= index1; --index3) { double num8 = num5 * elements2[index3]; double num9 = num6 * elements2[index3]; num3 = Math.Sqrt(num8 * num8 + num4 * num4); elements2[index3 + 1] = num3; if (num3 == 0.0) { elements1[index3 + 1] -= num7; elements2[index2] = 0.0; break; } else { num5 = num8 / num3; num6 = num4 / num3; double num10 = elements1[index3 + 1] - num7; num3 = (elements1[index3] - num10) * num5 + 2.0 * num6 * num9; num7 = num5 * num3; elements1[index3 + 1] = num10 + num7; num4 = num6 * num3 - num9; for (int index4 = 0; index4 < rows; ++index4) { double num11 = numArray[index4 + (index3 + 1) * rows]; numArray[index4 + (index3 + 1) * rows] = num5 * numArray[index4 + index3 * rows] + num6 * num11; numArray[index4 + index3 * rows] = num6 * numArray[index4 + index3 * rows] - num5 * num11; } } } if (num3 != 0.0 || index3 < index1) { elements1[index1] -= num7; elements2[index1] = num4; elements2[index2] = 0.0; } } } } while (index2 != index1); } for (int index = 0; index < rows * rows; ++index) z.Elements[index / rows, index % rows] = numArray[index]; }
public static bool AreCompatible(Vector v1, Vector v2) { return v1.nrows == v2.nrows; }
public Vector ElementDiv(Vector target, Vector source) { Vector vector = new Vector(target.nrows); for (int i = 0; i < this.nrows; ++i) vector[i] = target[i] / source[i]; return vector; }
public Vector ElementMult(Vector target, Vector source) { Vector v = new Vector(target.nrows); for (int i = 0; i < this.nrows; ++i) v[i] = target[i] * source[i]; return v; }
public Vector Sqrt() { Vector v = new Vector(this.nrows); for (int i = 0; i < this.nrows; ++i) v[i] = Math.Sqrt(this.elements[i]); return v; }
public Vector Sqr() { Vector v = new Vector(this.nrows); for (int i = 0; i < this.nrows; ++i) v[i] = this.elements[i] * this.elements[i]; return v; }