예제 #1
0
 /// <summary>
 /// Перемножение двух сетчаток
 /// </summary>
 /// <param name="a">первое сетчатка-слагаемое</param>
 /// <param name="b">второе сетчатка-слагаемое</param>
 /// <returns>Произведение сетчаток. Null в случае несовпадения числа столбцов a и числа строк b</returns>
 public static Retina operator *(Retina a, Retina b)
 {
     if (a.Width != b.Height)    // проверка согласованности матриц
         return null;
     Retina res = new Retina(a.Height, b.Width);
     for (int i = 0; i < a.Height; ++i)
         for (int j = 0; j < b.Width; ++j)
             for (int k = 0; k < a.Width; ++k)
                 res[i, j] += a[i, k] * b[k, j];
     return res;
 }
예제 #2
0
 /// <summary>
 /// Определение матрицы поворота на заданный угол 
 /// </summary>
 /// <param name="fi">угол поворота в градусах</param>
 /// <returns>Retina, соответствующий повороту fi</returns>
 public static Retina Rotation(double fi)
 {
     Retina res = new Retina(3, 3);
     double cos = Math.Cos(fi);
     double sin = Math.Sin(fi);
     res[0, 0] = res[1, 1] = cos;
     res[0, 1] = sin;
     res[1, 0] = -sin;
     res[2, 2] = 1;
     return res;
 }
예제 #3
0
 /// <summary>
 /// Объединение двух сетчаток, элементы которых содержат 0 или 1.
 /// </summary>
 /// <param name="that">Второе слагаемое-сетчатка</param>
 /// <returns>Объект Retina, сетчатка которой является результатом объединения</returns>
 public Retina Union(Retina that)
 {
     Retina res = new Retina(m, n);
     for (int i = 0; i < m; ++i)
         for (int j = 0; j < n; ++j)
             res[i, j] = (this[i, j] == 0 && that[i, j] == 0) ? 0 : 1;
     return res;
 }
예제 #4
0
 /// <summary>
 /// Сумма двух сетчаток
 /// </summary>
 /// <param name="that">Второе слагаемое-сетчатка</param>
 /// <returns>Объект Retina, сетчатка которой является результатом суммы</returns>
 public Retina Sum(Retina that)
 {
     Retina res = new Retina(m, n);
     for (int i = 0; i < m; ++i)
         for (int j = 0; j < n; ++j)
             res[i, j] = this[i, j] + that[i, j];
     return res;
 }
예제 #5
0
 /// <summary>
 /// Скалярное произведение сетчаток
 /// </summary>
 /// <param name="that">вектор, на который скалярно умножается сетчатка</param>
 /// <returns>Скалярное произведение двух сетчаток</returns>
 public double scalarProduct(Retina that)
 {
     double res = 0;
     for (int i = 0; i < m; ++i)
         for (int j = 0; j < n; ++j)
             res += this[i, j] * that[i, j];
     return res;
 }
예제 #6
0
 /// <summary>
 /// Скалярное умножение сетчатки на val
 /// </summary>
 /// <param name="val">Скаляр, на который умножается сетчатка</param>
 /// <returns>Объект Retina, сетчатка которой является результатом скалярного умножения</returns>
 public Retina mulScalar(double val)
 {
     Retina res = new Retina(m, n);
     for (int i = 0; i < m; ++i)
         for (int j = 0; j < n; ++j)
             res[i, j] = this[i, j] * val;
     return res;
 }
예제 #7
0
 /// <summary>
 /// Параллельный перенос
 /// </summary>
 /// <param name="a">смещение по оси X</param>
 /// <param name="b">смещение по оси Y</param>
 /// <returns>Матрица, соответствующая параллельному переносу на (a,b)</returns>
 public static Retina Translation(double a, double b)
 {
     Retina m = new Retina(3, 3);
     m[0, 0] = m[1, 1] = m[2, 2] = 1;
     m[2, 0] = a;
     m[2, 1] = b;
     return m;
 }