예제 #1
0
파일: Vector.cs 프로젝트: heber/FreeOQ
		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;
		}
예제 #2
0
파일: Vector.cs 프로젝트: heber/FreeOQ
		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;
		}
예제 #3
0
파일: Vector.cs 프로젝트: heber/FreeOQ
		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;
		}
예제 #4
0
파일: Matrix.cs 프로젝트: heber/FreeOQ
		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];
		}
예제 #5
0
파일: Matrix.cs 프로젝트: heber/FreeOQ
		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;
		}
예제 #6
0
파일: Matrix.cs 프로젝트: heber/FreeOQ
		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];
		}
예제 #7
0
파일: Matrix.cs 프로젝트: heber/FreeOQ
		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];
		}
예제 #8
0
파일: Vector.cs 프로젝트: heber/FreeOQ
		public static bool AreCompatible(Vector v1, Vector v2)
		{
			return v1.nrows == v2.nrows;
		}
예제 #9
0
파일: Vector.cs 프로젝트: heber/FreeOQ
		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;
		}
예제 #10
0
파일: Vector.cs 프로젝트: heber/FreeOQ
		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;
		}
예제 #11
0
파일: Vector.cs 프로젝트: heber/FreeOQ
		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;
		}
예제 #12
0
파일: Vector.cs 프로젝트: heber/FreeOQ
		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;
		}