Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Реализовать обобщенный класс вектор и все операции векторной
- алгебры, а также нахождение модуля и скалярного произведения двух векторов.
- Реализовать статическую функцию, которая проводит процесс ортогонализации
- переданного множества векторов. Аргументом этой функции является
- коллекция векторов. Реализовать способ сравнения векторов, методы
- преобразования в(из) массив(а) элементов соответствующего типа. При
- описании шаблона укажите ограничения: наличие пустого конструктора у типа-
- аргумента
- */
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace lab07
- {
- class Vector<T> where T : new()
- {
- public List<T> data
- {
- private set;
- get;
- }
- public int Length
- {
- get
- {
- return data.Count;
- }
- }
- public Vector()
- {
- data = new List<T>();
- }
- public Vector(List<T> d)
- {
- data = d;
- }
- public Vector(T[] ar)
- {
- data = new List<T>();
- foreach (T el in ar) data.Add(el);
- }
- public override string ToString()
- {
- string temp = "{";
- foreach (var n in this.data) temp += String.Format("{0} ", n);
- temp += "}";
- return temp;
- }
- public static Vector<T> operator +(Vector<T> left, Vector<T> right)
- {
- var temp = new List<T>(left.data);
- for (int i = 0; i < temp.Count; ++i)
- {
- temp[i] += (dynamic)right.data[i];
- }
- return new Vector<T>(temp);
- }
- public static Vector<T> operator -(Vector<T> left, Vector<T> right)
- {
- var temp = new List<T>(left.data);
- for (int i = 0; i < temp.Count; ++i)
- {
- temp[i] -= (dynamic)right.data[i];
- }
- return new Vector<T>(temp);
- }
- public static T operator *(Vector<T> left, Vector<T> right)
- {
- if (typeof(T) == typeof(ComplexNumber))
- {
- var temp = new ComplexNumber();
- for (int i = 0; i < left.Length; ++i)
- temp = (dynamic)temp + ((dynamic)left.data[i] * right.data[i]);
- return (dynamic)temp;
- }
- else
- {
- double temp = 0;
- for (int i = 0; i < left.Length; ++i)
- temp = (dynamic)temp + ((dynamic)left.data[i] * (dynamic)right.data[i]);
- return (dynamic)temp;
- }
- }
- public static Vector<T> operator *(Vector<T> left, T right)
- {
- var temp = new Vector<T>(left.data);
- for (int i = 0; i < temp.Length; ++i) temp.data[i] = right * (dynamic)temp.data[i];
- return temp;
- }
- public static Vector<T> operator /(Vector<T> left, T right)
- {
- return left * (1 / (dynamic)right);
- }
- public static T Abs(Vector<T> value)
- {
- if (typeof(T) == typeof(ComplexNumber))
- {
- var temp = new ComplexNumber();
- foreach (var n in value.data) temp = (dynamic)temp + (dynamic)n * n;
- return ComplexNumber.Sqrt((dynamic)temp);
- }
- else
- {
- double temp = 0;
- foreach (var n in value.data) temp = (dynamic)temp + (dynamic)n * n;
- return (T)(dynamic)Math.Sqrt((dynamic)temp);
- }
- }
- public static List<Vector<T>> Orto(List<Vector<T>> value)
- {
- var temp = new List <Vector<T>>(value.Count);
- temp.Add(value.ElementAt(0));
- for (int i = 0; i < value.Count; ++i)
- {
- if (i != 0)
- {
- for (int j = 0; j < i; ++j)
- {
- T k = (((dynamic)value[i] * temp[j]) / ((dynamic)temp[j] * temp[j]));
- temp[i] = temp[i] - (dynamic)temp[j] * k;
- }
- }
- }
- return temp;
- }
- public T[] ToArray()
- {
- T[] temp = new T[this.Length];
- int i = 0;
- foreach (var n in this.data) temp[i++] = n;
- return temp;
- }
- public static Vector<T> FromArray(T[] value)
- {
- return new Vector<T>(value);
- }
- public bool Equals(Vector<T> value)
- {
- return this.Equals(value.data);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement