Advertisement
mrAnderson33

математический вектор

Nov 22nd, 2017
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.17 KB | None | 0 0
  1. /*
  2. Реализовать обобщенный класс вектор и все операции векторной
  3. алгебры, а также нахождение модуля и скалярного произведения двух векторов.
  4. Реализовать статическую функцию, которая проводит процесс ортогонализации
  5. переданного множества векторов. Аргументом этой функции является
  6. коллекция векторов. Реализовать способ сравнения векторов, методы
  7. преобразования в(из) массив(а) элементов соответствующего типа. При
  8. описании шаблона укажите ограничения: наличие пустого конструктора у типа-
  9. аргумента
  10. */
  11.  
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Text;
  16.  
  17. namespace lab07
  18. {
  19.  
  20.     class Vector<T> where T : new()
  21.     {
  22.         public List<T> data
  23.         {
  24.             private set;
  25.             get;
  26.         }
  27.         public int Length
  28.         {
  29.             get
  30.             {
  31.                 return data.Count;
  32.             }
  33.         }
  34.  
  35.         public Vector()
  36.         {
  37.             data = new List<T>();
  38.         }
  39.         public Vector(List<T> d)
  40.         {
  41.             data = d;
  42.         }
  43.  
  44.         public Vector(T[] ar)
  45.         {
  46.             data = new List<T>();
  47.             foreach (T el in ar) data.Add(el);
  48.         }
  49.  
  50.         public override string ToString()
  51.         {
  52.             string temp = "{";
  53.             foreach (var n in this.data) temp += String.Format("{0} ", n);
  54.             temp += "}";
  55.             return temp;
  56.         }
  57.  
  58.         public static Vector<T> operator +(Vector<T> left, Vector<T> right)
  59.         {
  60.             var temp = new List<T>(left.data);
  61.             for (int i = 0; i < temp.Count; ++i)
  62.             {
  63.                 temp[i] += (dynamic)right.data[i];
  64.             }
  65.  
  66.             return new Vector<T>(temp);
  67.         }
  68.  
  69.         public static Vector<T> operator -(Vector<T> left, Vector<T> right)
  70.         {
  71.             var temp = new List<T>(left.data);
  72.             for (int i = 0; i < temp.Count; ++i)
  73.             {
  74.                 temp[i] -= (dynamic)right.data[i];
  75.             }
  76.  
  77.             return new Vector<T>(temp);
  78.         }
  79.  
  80.         public static T operator *(Vector<T> left, Vector<T> right)
  81.         {
  82.  
  83.             if (typeof(T) == typeof(ComplexNumber))
  84.             {
  85.                 var temp = new ComplexNumber();
  86.                 for (int i = 0; i < left.Length; ++i)
  87.                     temp = (dynamic)temp + ((dynamic)left.data[i] * right.data[i]);
  88.                 return (dynamic)temp;
  89.             }
  90.             else
  91.             {
  92.                 double temp = 0;
  93.                 for (int i = 0; i < left.Length; ++i)
  94.                     temp = (dynamic)temp + ((dynamic)left.data[i] * (dynamic)right.data[i]);
  95.                 return (dynamic)temp;
  96.             }
  97.  
  98.         }
  99.  
  100.         public static Vector<T> operator *(Vector<T> left, T right)
  101.         {
  102.             var temp = new Vector<T>(left.data);
  103.  
  104.             for (int i = 0; i < temp.Length; ++i) temp.data[i] = right * (dynamic)temp.data[i];
  105.  
  106.             return temp;
  107.         }
  108.  
  109.         public static Vector<T> operator /(Vector<T> left, T right)
  110.         {
  111.             return left * (1 / (dynamic)right);
  112.         }
  113.  
  114.  
  115.  
  116.         public static T Abs(Vector<T> value)
  117.         {
  118.             if (typeof(T) == typeof(ComplexNumber))
  119.             {
  120.                 var temp = new ComplexNumber();
  121.                 foreach (var n in value.data) temp = (dynamic)temp + (dynamic)n * n;
  122.                 return ComplexNumber.Sqrt((dynamic)temp);
  123.             }
  124.             else
  125.             {
  126.                 double temp = 0;
  127.                 foreach (var n in value.data) temp = (dynamic)temp + (dynamic)n * n;
  128.                 return (T)(dynamic)Math.Sqrt((dynamic)temp);
  129.             }
  130.  
  131.         }
  132.  
  133.         public static List<Vector<T>> Orto(List<Vector<T>> value)
  134.         {
  135.             var temp = new  List <Vector<T>>(value.Count);
  136.  
  137.  
  138.             temp.Add(value.ElementAt(0));
  139.  
  140.             for (int i = 0; i < value.Count; ++i)
  141.             {
  142.                 if (i != 0)
  143.                 {
  144.                     for (int j = 0; j < i; ++j)
  145.                     {
  146.                         T k = (((dynamic)value[i] * temp[j]) / ((dynamic)temp[j] * temp[j]));
  147.                         temp[i] = temp[i] - (dynamic)temp[j] * k;
  148.                        
  149.                     }
  150.  
  151.                   }
  152.  
  153.             }
  154.  
  155.             return temp;
  156.         }
  157.  
  158.         public T[] ToArray()
  159.         {
  160.             T[] temp = new T[this.Length];
  161.             int i = 0;
  162.             foreach (var n in this.data) temp[i++] = n;
  163.             return temp;
  164.         }
  165.  
  166.         public static Vector<T> FromArray(T[] value)
  167.         {
  168.             return new Vector<T>(value);
  169.         }
  170.  
  171.         public bool Equals(Vector<T> value)
  172.         {
  173.             return this.Equals(value.data);
  174.         }
  175.     }
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement