/// <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; }
/// <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; }
/// <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; }
/// <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; }
/// <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; }
/// <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; }
/// <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; }