Notebook interface внутри MATLAB

Многие учёные, работающие с данными любят писать код не в виде голых скриптов, а используя так называемый notebook interface (типичный пример - Jupyter Notebook). Удобно это прежде всего потому, что ваш код становится более понятным, комментарии к коду хорошо читаются, а главное, прямо между строк можно вставлять результаты выполнения кода, например, полученные графики и построения.

В 2016 году MATLAB тоже создал свой вариант такого интерфейса, но на самом деле я пока не часто вижу, что им кто-то пользуется. Одна из причин (именно она побудила меня написать эту заметку) - не все знают об этой возможности MATLAB, хотя найти её совсем не сложно, она буквально постоянно маячит перед глазами (если у вас, конечно, установлен свежий MATLAB).

Итак, Notebook interface в MATLAB называется Live Editor, в которм можно создавать "живые скрипты" (Live Script). Создать такой скрипт можно также, как вы создаёте обычный скрипт (m-файл). На вкладке HOME для этого отведена специальная кнопка "new live script'. Если кнопки не окажется, поищите её под кнопкой "New":

Читать далее «Notebook interface внутри MATLAB»

Наносим линейный тренд на график временного хода в MATLAB

Сегодня мы нанесём линию тренда с доверительными интервалами на график временного ряда.

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

nao = load('norm.nao.monthly.b5001.current.ascii.txt');

Для того, чтобы тренд был явно выражен мы выбрали только последние несколько лет (да-да, это тот самый случай, когда учёные манипулируют с данными, никогда так не делайте в своей научной работе):

dates = datetime(nao(750:end,1),nao(750:end,2),15);
nao=nao(750:end,3);

Построим график для того, чтобы представлять, с чем имеем дело (параметр 'k' делает линию чёрной, а 'LineWidth' устанавливает толщину линии):

plot(dates, nao,'k','LineWidth',2)
Индекс NAO

Тренд здесь хорошо заметен. Если вам нужно удалить линейный тренд из данных, то сделать это можно при помощи простой функции detrend:

Читать далее «Наносим линейный тренд на график временного хода в MATLAB»

Как в MATLAB перевести координаты из формата «градусы-минуты» в градусы.

В прошлый раз мы с вами переводили долготы из формата [0 360] в формат [-180 180]. Сегодня мы разберёмся ещё с одной проблемой, которая периодически встречается в работе океанолога да и вообще любого географа. 

Широты и долготы принято измерять в градусах, в одном градусе 60 минут, а в одной минуте 60 секунд, секунды обычно записывают уже десятичной дробью, что намного удобнее. А ещё удобнее взять и сразу записать всё просто в градусах, а десятичной дробью записывать всё что меньше градуса и никаких минут и секунд.

Т.е. вместо 20°30' записывать 20.5°, или вместо 40°59'59'' записывать 40.9997°. Если вы не штурман, а датасайнтист, то в большинстве случаев так намного удобнее. Однако данные иногда приходят нам с координатами, записанными в разных форматах. Конечно, с пересчётом из одного формата в другой справится даже школьник, однако в MATLAB эти лишние телодвижения никчему, так как есть родная функция, которая сделает всё за вас. Вернее говоря, это несколько функций. Первая, dm2degrees переводит координаты из формата "градусы-минуты" в градлусы. Для её работы необходимо иметь матрицу, состоящую из двух столбцов, в первом столбце указаны градусы (только целые числа), во втором минуты (можно с десятыми долями), например:

lat = [50 34; 51 45.3; 53 21.89]

lat =

   50.0000   34.0000
   51.0000   45.3000
   53.0000   21.8900

В итоге, скормив эту матрицу функции dm2degrees, вы получите:

dm2degrees(lat)

ans =

   50.5667
   51.7550
   53.3648

Конечно, если у вас данные записаны не в одной переменной, а в двух разных, то проблем тоже не возникнет:

lat_d = [50; 51; 53]

lat_d =

    50
    51
    53

lat_m = [34; 45.3; 21.89]

lat_m =

   34.0000
   45.3000
   21.8900

dm2degrees([lat_d lat_m])

ans =

   50.5667
   51.7550
   53.3648

Если ваши данные представлены в формате "градусы - минуты - секунды", то вам нужна будет другая функция dms2degrees. Работает она практически также, только на вход ей нужна теперь матрица состоящая из трёх столбцов (градусы, минуты, секунды). Грубо говоря, вам нужно будет записать dm2degrees([lat_d, lat_m, lat_s]).

Есть и обратные функции degrees2dm и degrees2dms, которые конвертируют всё обратную сторону.

 telegram

Чтобы не пропустить новые материалы с рецептами по работе с океанологическими данными, подпишитесь на канал в Telegram: https://t.me/koldunovaleksey