Как сгладить график в MATLAB?

По моему скромному мнению. существует две конфликтующих проблемы с решением, где бизнес-логика входит в управляемое реляционной базой данных приложение:

  • пригодность для обслуживания
  • надежность

Ре. пригодность для обслуживания: Для обеспечения эффективной будущей разработки бизнес-логика принадлежит части приложения, это является самым легким к управлению отладкой и управлению версиями.

Ре. надежность: Когда существует значительный риск несоответствия, бизнес-логика принадлежит слоя базы данных. Реляционные базы данных могут быть разработаны для проверки на ограничения на данные, например, не позволяющий Нулевые значения в определенных столбцах, и т.д. Когда сценарий возникает в проектировании приложений, где некоторые данные должны быть в определенном состоянии, которое слишком сложно для выражения этими простыми ограничениями, может иметь смысл использовать триггер или что-то подобное в слое базы данных.

Триггеры являются болью, чтобы быть в курсе, особенно когда Ваше приложение, как предполагается, работает на клиентских системах, у Вас даже нет доступа также. Но это не означает, что невозможно отслеживать их или обновить их. Аргументы S.Lott в его ответе, что это - боль и стычка, абсолютно допустимы, я буду второй это и был там также. Но если Вы имеете в виду те ограничения, когда Вы сначала разрабатываете свой слой данных и воздерживаетесь от использования триггеров и функций для чего-либо кроме абсолютных предметов первой необходимости, это управляемо.

В нашем приложении, большая часть бизнес-логики содержится в образцовом слое приложения, например, счет знает, как инициализировать себя из данного заказа на покупку. Когда набор разных вещей изменяется последовательно для сложного набора изменений как это, мы свертываем их в транзакции для поддержания непротиворечивости, вместо того, чтобы выбрать хранимую процедуру. Вычисление общих количеств и т.д. все сделано с методами в образцовом слое. Но когда мы должны денормализовать что-то для производительности или вставить данные в таблицу 'изменений', используемую всеми клиентами для выяснения, какие объекты они должны истечь в своем кэше сессии, мы используем триггеры/функции в слое базы данных, чтобы вставить новую строку и отослать уведомление (Пост-ГРЭС слушает/уведомляет материал) от этого триггера.

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

К счастью, мы действительно имеем в распоряжении некоторую систему для отслеживания версии схемы, таким образом, мы создали что-то к тому же для заботы о замене функций базы данных. Это сэкономило бы нам некоторое время теперь, если бы мы рассмотрели потребность заменить их с начала все же.

<час>

, Конечно, все изменяется, когда Вы ступаете за пределами области RDBMS в системы хранения кортежа как Amazon SimpleDB и BigTable Google. Но это - другая история:)

20
задан Lazer 4 October 2009 в 09:03
поделиться

4 ответа

Простой (специальный) способ - просто взять средневзвешенное значение (настраиваемое с помощью альфа ) в каждой точке с ее соседями:

data(2:n-1) = alpha*data(2:n-1) + (1-alpha)*0.5*(data(1:n-2)+data(3:n))

или некоторыми его вариациями. Да, для большей сложности вы можете сначала преобразовать данные Фурье, а затем отсечь высокие частоты. Что-то вроде:

f = fft(data)
f(n/2+1-20:n/2+20) = zeros(40,1)
smoothed = real(ifft(f))

Вырезает 20 самых высоких частот. Будьте осторожны, чтобы вырезать их симметрично, иначе обратное преобразование больше не будет реальным. Вам нужно тщательно выбирать частоту среза для правильного уровня сглаживания. Это очень простой вид фильтрации (блочная фильтрация в частотной области), поэтому вы можете попробовать мягко ослабить частоты высокого порядка, если искажение недопустимо.

17
ответ дан 29 November 2019 в 23:02
поделиться

Если у вас есть Набор инструментов подгонки кривой , вы можете использовать функцию сглаживание . Метод по умолчанию - скользящее среднее размера 5 (метод можно изменить). Пример:

% some noisy signal
Fs = 200; f = 5;
t = 0:1/Fs:1-1/Fs;
y = sin(2*pi*f*t) + 0.6*randn(size(t));
subplot(411)
plot(y), title('Noisy signal')

% smoothed signal
subplot(412)
plot( smooth(y, 5, 'moving') ), title('smooth')
ylim([-2 2])

Если нет, вы можете использовать свою собственную оконную функцию, используя функцию filter из ядра MATLAB:

% equivalent to a moving average window
wndwSize = 5;
h = ones(1,wndwSize)/wndwSize;
subplot(413)
plot( filter(h, 1, y) ), title('filter + square window')

% Guassian
h = pdf('Normal',-floor(wndwSize/2):floor(wndwSize/2),0,1);
subplot(414)
plot( filter(h, 1, y) ), title('filter + Guassian window')

screenshot

30
ответ дан 29 November 2019 в 23:02
поделиться

Сначала я бы попробовал отобразить скользящее среднее по нескольким точкам, например, 5 или 10. Таким образом, единственное расхождение в значениях оказывает лишь небольшое влияние на график. Конечно, это зависит от того, насколько точным должен быть график.

1
ответ дан 29 November 2019 в 23:02
поделиться

БПФ - неплохая идея, но, вероятно, здесь его перебор. Скользящие или скользящие средние обычно дают плохие результаты, и их следует избегать для чего-либо, кроме позднего домашнего задания (и белого шума).

Я бы использовал фильтрацию Савицкого-Голея (в Matlab sgolayfilt (...)). Это даст вам наилучшие результаты для того, что вы ищете - некоторое локальное сглаживание при сохранении формы кривой.

-Paul

5
ответ дан 29 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

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