одномерная свертка гаусса функционирует в Matlab

Методы фабрики нужно рассмотреть как альтернативу конструкторам - главным образом, когда конструкторы не достаточно выразительны, т.е.

class Foo{
  public Foo(bool withBar);
}

не так выразительно как:

class Foo{
  public static Foo withBar();
  public static Foo withoutBar();
}

классы Фабрики полезны при необходимости в сложном процессе для построения объекта когда конструкция нуждается в зависимости, которую Вы не хотите для фактического класса, когда необходимо создать различные объекты и т.д.

7
задан Nathan Fellman 2 December 2009 в 14:20
поделиться

2 ответа

Идея состоит в том, что фильтр должен быть достаточно широким, чтобы представлять функцию Гаусса. Эмпирическое правило - использовать размер фильтра не менее 6 * сигма .

Так как поддержка должна быть сосредоточена вокруг нуля, это даст вам диапазон -3 * сигма [ От 1119014] до + 3 * сигма (чтобы быть более точным, это - / + round (6 * sigma - 1) / 2 для учета нуля в середине). Отсюда:

function gaussFilter = gauss(sigma)
    width = round((6*sigma - 1)/2);
    support = (-width:width);
    gaussFilter = exp( -(support).^2 ./ (2*sigma^2) );
    gaussFilter = gaussFilter/ sum(gaussFilter);

Пример : (все следующие эквивалентны)

sigma = 1.2;
width = round((6*sigma - 1)/2);

gauss(sigma)

normpdf( -width:width, 0, sigma )

fspecial('gaussian', [1 2*width+1], sigma)

h = gausswin(2*width+1)';
h = h / sum(h)
4
ответ дан 7 December 2019 в 05:24
поделиться

Отличная головоломка!

Я вижу, что большинство людей запоминают положение каждой части. Как насчет того, чтобы применить более простой подход и сохранить содержимое каждого квадрата ? Это обеспечивает автоматическое продвижение и захваченные фрагменты.

И это позволяет использовать кодирование Хаффмана . Фактически, начальная частота фигур на доске почти идеальна для этого: половина квадратов пусты, половина оставшихся квадратов - пешки и т. Д.

Учитывая частоту каждой фигуры, я построил Хаффмана дерево на бумаге, которое я здесь повторять не буду. Результат, где c обозначает цвет (белый = 0, черный = 1):

  • 0 для пустых полей
  • 1c0 для пешки
  • 1c100 для ладьи
  • 1c101 для коня
  • 1c110 для слона
  • 1c1110 для ферзя
  • 1c1111 для короля

для всей доски в исходной ситуации у нас

  • пустых клеток: 32 * 1 бит = 32 бита
  • пешек: 16 * 3 бита = 48 бит
  • ладьи / кони / слоны: 12 * 5 бит = 60 бит
  • ферзей / королей: 4 * 6 бит = 24 бита

Всего: 164 бита для начального состояния платы. Значительно меньше, чем 235 бит ответа, получившего наибольшее количество голосов. И он будет только уменьшаться по мере развития игры (кроме случаев повышения).

Я смотрел только на положение фигур на доске; дополнительное состояние (чей ход, кто рокировался, на проходе, повторяющиеся ходы и т. д.) нужно будет кодировать отдельно. Может быть, еще 16 бит самое большее, Возможные оптимизации:

  • Исключение менее часто используемых частей и отдельное сохранение их позиции. Но это не поможет ... замена короля и ферзя пустым квадратом позволяет сэкономить 5 бит, а это как раз те 5 бит, которые вам нужны, чтобы закодировать их положение другим способом.
  • «Нет пешек на заднем ряду» легко может быть кодироваться с использованием другой таблицы Хаффмана для задних строк, но я сомневаюсь, что это сильно помогает. Вы, вероятно, все равно получите то же дерево Хаффмана.
  • «Один белый, один черный слон» можно закодировать, введя дополнительные символы, у которых нет бита c , которые затем могут быть выводится из квадрата, на котором находится слон. (Пешки, получившие звание слонов, нарушают эту схему ...)
  • Повторение пустых квадратов может быть закодировано по длине серии, введя дополнительные символы, скажем, для "

    [-3*sigma -2*sigma -1*sigma 0 1*sigma 2*sigma 3*sigma]
    

    И если вы возведете в квадрат каждый элемент поддержки и умножите на -1, -support. ^ 2

    [-9*sigma^2 -4*sigma^2 -1*sigma^2 0 -1*sigma^2 -4*sigma^2 -9*sigma^2]
    

    Таким образом, разделив его на 2 * sigma ^ 2 , всегда будет один и тот же вектор ,

    [-9/2 -4/2 -1/2 0 -1/2 -4/2 -9/2]
    

    Или

    -4.5000   -2.0000   -0.5000         0   -0.5000   -2.0000   -4.5000
    

    Итак, , поэтому вы всегда получаете один и тот же ответ.

    Итак, вам нужно проверить свой алгоритм на создание одномерного гауссовского фильтра.

    РЕДАКТИРОВАТЬ:

    Ваш исходный код в порядке: кроме Я не понимаю, почему вы сделали поддержку с -3 * sigma: sigma: 3 * sigma - вы должны изменить его на support = -3: 3 .

    Вы также можете использовать:

    gaussFilter = fspecial('gaussian',[1 7],sigma)
    

    EDIT: Ознакомьтесь с решением Amro для получения полного кода и объяснения, почему support = -3 * sigma: 3 * sigma , а не support = -3 * sigma: sigma: 3 * sigma

4
ответ дан 7 December 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: