Переменные persistent в Matlab

В Matlab есть одна довольно редко используемая и не очевидная функциональность, заключающаяся в использовании переменных с модификатором persistent. Фактически такие переменные аналогичны статическим переменным в теле метода, например у С++. Одним из наиболее типичных сценариев использования таких переменных является написание функций загрузки большого объема данных либо длительной предварительной обработки. При первом запуске метода, содержащего переменную с модификатором persistent, эта переменная будет пустой. При последующих запусках, если функция не изменялась, значение переменной persistent сохранится. Таким образом можно выполнить длительные вычисления или загрузку данных с диска (десериализация mat-файлов в Matlab работает довольно медленно) только при первом вызове функции.

function DB = LoadDB(DBPath, Reload)
%function DB = LoadDB(DBPath, Reload)
% функция чтения данных по пути DBPath
% Reload — принудительная перезагрузка (по умолчанию — false)

if nargin<2 %если переменная Reload не задана, задаем значение по умолчанию Reload = false; end persistent db; if isempty(db) || Reload %если еще не разу ни запускали чтение или необходимо принудительно повторить загрузку данных % читаем базу в переменную db end Db = db; %копируем в выходную переменную [/sourcecode]

Почему MatLab fft выдает разные результаты для строк и столбцов

Небольшое недоумение возникает при попытке сравнения результатов быстрого преобразования Фурье (функция fft) от вещественных столбцов и строк — полученные векторы комплексно-сопряженные. Это связано с тем, что операция транспонирования в Matlab для матриц с комплексными числами не просто транспонирует, а конвертирует все значения в комплексно-сопряженные. Поэтому, чтобы БПФ работало «ожидаемо», нужно пользоваться оператором поэлементного транспонирования .’

isequal(fft(x').',fft(x)) % Возвращает истину

m2html — генерация Matlab документации

Библиотека M2html позволяет сгенерировать html-документацию для Matlab-кода. Думаю, не нужно рассказывать о том, как это может быть полезно при работе с большим проектом или созданием тулбокса.

m2html('mfiles','auditech', 'htmldir','documentation', ...
       'recursive','on', 'global','on', ...
      'template','frame1251', 'index','menu', 'graph','on');

Стоит отметить большую гибкость инструмента, состоящую в использовании шаблонов. Так, например, для использования шаблона frame с русскими комментариями (в кодировке Win-1251) необходимо изменить кодировку во всех TPL-файлу. Лучше всего скопировать в новую папку с шаблоном, например, как у меня с названием frame1251, далее charset=iso-8859-1 меняется на charset=windows-1251.

Задача о назначениях — алгоритм Matlab

Часто может понадобиться решать задачу о назначениях. Например, при составлении расписания о наилучшем распределении работ между таким же числом исполнителей. При этом необходимо найти оптимальное назначение из условия максимума общей эффективности, которая равна сумме производительности исполнителей. Наиболее эффективным методом ее решения является Венгерский алгоритм. Понятно, что задача о назначениях имеет много интерпретаций: распределение груза по транспортным средствам, распределение задач для выполнения на нескольких компьютерах и т.д и т.п.Если необходимо решить такую задачу с использованием Matlab, можно воспользоваться готовой функцией munkres. Вычислительная сложность алгоритма O (n^3).

Ссылки по теме:

Маленькие хитрости Matlab waitbar

Прогресс-бар в Matlab (функция waitbar) имеет два неудобства:

1. Отсутствие прямой опции  отключения интерпретатора синтаксиса TeX(как у plot(…,’Interpreter’, ‘none’). Без этого, например, при выводе путей со слешами в консоль будут выдаваться предупреждения. Следующая маленькая функция получает waitbar с отключенной интерпретацией


function hwait = waitbar_none_tex(message)

%return standard Matlab waitbar handle with disabled message interpreter
hwait = waitbar(0,'start message);
hchild = get(hwait,'children');
htitle = get(hchild,'title');
set(htitle,'Interpreter','None');
set(htitle,'String',message);

2. При отладке программы может остаться много незакрытых  окон прогресса. Для того, чтобы не закрывать все окошки руками можно воспользоваться командой close all hidden

Подсветка синтаксиса MatLab в WordPress

Для подсветки синтаксиса исходного кода на сайте WordPress я остановился на плагине SyntaxHighlighter Plus . Однако, в нем нет поддержки синтаксиса Matlab, хотя бы подсветки комментариев. Но что нам стоит дом построить — сейчас  возьмем и добавим.

При просмотре папки плагина  (wp-contentpluginssyntaxhighlighter-plus) видим, что реализация подсветки для конкретного языка программирования находится в файлах c именами типа shBrushPerl.js (для Perl).

Берем за основу синтаксис Delphi, более всего похожий на Matlab. Копируем файл shBrushDelphi.js под именем  shBrushMatlab.js.

Привязка JS-кода и имен языков находится в файле syntaxhighlighter.php, начиная со строки «$this->aliases = apply_filters( ‘agsyntaxhighlighter_aliases’, array». Таким образом, мы можем легко подключить новый файл, добавив строку:

‘MatLab’  => array(‘matlab’),

Простого копирования файла с новым именем недостаточно, в JS-файле есть привязки к имени языка, нужно заменить все вхождения Delphi на Matlab внутри файла shBrushMatlab.js

Теперь можно использовать подсветку синтаксиса Matlab  коде статьи, записывая текст программы внутри тегов «». Остается только добавить нужные правила: отредактировать список ключевых слов, написать регулярное выражение для экзотического стиля комментариев в Matlab(после символа %).

Регулярное выражение будет следующим: %.*$

Список ключевых слов, куда я добавил несколько базовых функций Matlab, не претендует на полноту. Тем не менее, итоговый java-script код можно увидеть здесь.

Небольшая демонстрация


s = 'string literal';% подсветка строк
x = zeros(1, 4);%подсветка основных функций Matlab
z = [1 2 ; 3 4];

for i=1:length(x)
if x(i)==0
x(i) = x(i)+1;%комментарий 4%4
end
end

return 0;

function y =  myfunc(x)

y = sin(x)+5;