MATLAB.Exponenta
–Û·Ë͇ Matlab&Toolboxes

MATLAB

В.Г.Потемкин "Введение в Matlab" (v 5.3)
Глава 3. Программирование в среде Matlab 5

  В оглавление книги \ К следующему разделу \ К предыдущему разделу \ Предметный указатель

3.10. Повышение эффективности обработки М-файлов

Этот раздел описывает методы повышения быстродействия при выполнении программы и управление памятью:

  • векторизация циклов;
  • предварительное размещение векторов.

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

Векторизация циклов. Под векторизацией понимается преобразование циклов for и while к эквивалентным векторным или матричным выражениям. При векторизации алгоритма ускоряется выполнение M-файла.

Пример
Вот один из способов вычислить 1001 значение функции синуса на интервале [0 10], используя оператор цикла:
                i = 0;
                for t = 0:.01:10
                        i = i + 1;
                    y(i) = sin(t);
                end
             Эквивалентная векторизованная форма имеет вид
                t = 0:.01:10;
                y = sin(t);
В этом случае вычисления выполняются намного быстрее, и такой подход в системе MATLAB является предпочтительным. Время выполнения этих М-файлов можно оценить, используя команды tic и toc.

Пример
Функция repmat - формирование массива из частей - использует преимущество векторизации. Она имеет три входных аргумента: массив A, количество строк М и столбцов N для вновь создаваемого массива.
Функция repmat возвращает массив B , который использует массив A в качестве основы для построения блочной матрицы с количеством блоков MxN:

                A = [1 2 3; 4 5 6];
                B = repmat(A, 2, 3);

                B =

1 2 3 1 2 3 1 2 3
4 5 6 4 5 6 4 5 6
1 2 3 1 2 3 1 2 3
4 5 6 4 5 6 4 5 6

Функция repmat использует векторное представление для индексов, указывающих размещение блоков:

               function B = repmat(A, M, N)
               if nargin 2
              error('Требуется, по крайней мере, 2 входа.')
              elseif nargin == 2
              N = M;
              end

[m,n] = size(A); %Определить количество строк и столбцов блока А.
mind = (1:n)’;
nind = (1:n)';
%Векторизовать индексы в соответствии с количеством вертикальных и горизонтальных блоков.
mind = mind(:, ones(1, M));
nind = nind(:, ones(1, N));
B = A(mind, nind);
%Сформировать матрицы индексов для размещения блока А.

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

Тип массива Функция Примеры
Массив чисел zeros y = zeros(1, 100)
for i = 1:100
     y(i) = det(X^i);
end
Массив записей struct data = struct([1 3], 'x', [1 3], 'y', [5 6])
data(3).x = [9 0 2];
data(3).y = [5 6 7];
Массив ячеек cell B = cell(2, 3)
B{1, 3} = 1:3;
B{2, 2} = 'string';

Предварительное выделение памяти позволяет избежать фрагментации памяти при работе с большими матрицами. В ходе сеанса работы системы MATLAB, память может стать фрагментированной из-за работы механизмов динамического распределения и освобождения памяти. Это может привести к появлению большого количества фрагментов свободной памяти, и непрерывного пространства памяти может оказаться недостаточно для хранения какого-либо большого массива.

Предварительное выделение памяти позволяет определить непрерывную область, достаточную для проведения всех вычислений.

Функции управления памятью.

Существует несколько подходов к повышению эффективности использования памяти, рассмотренные ниже. В системе MATLAB предусмотрено пять функций для работы с памяти:

  • команда clear - удаление переменных из оперативной памяти;
  • команда pack - запись текущих переменных на диск и последующей их загрузкой;
  • функция quit - по мере необходимости выход системы MATLAB с освобождением всей памяти;
  • команда save - сохранение переменных в файле.
  • команда load - считывание данных из файла.

Замечание

Команды save и load работают быстрее, чем утилиты ввода-вывода системы МАТLАВ. Эти команды оптимизированы как по скорости выполнения, так и по возможности фрагментации памяти.

На некоторых платформах команда whos выводит на экран количество оставшейся свободной памяти. Тем не менее полезно знать:

  • поскольку команда whos выдаёт размер непрерывной свободной памяти, то при удалении переменной из рабочей области, объём свободной памяти не увеличивается, так как переменная занимает старшие адреса памяти;
  • на компьютерах с виртуальной памятью количество оставшейся свободной памяти не отображается, поскольку ни система MATLAB, ни аппаратные средства не налагают на размер используемой памяти никаких ограничений.

Удаление функции из памяти. При загрузке MATLAB создает список имён всех M- и MEX-файлов, которые находятся в каталоге matlab/toolbox. Этот список сохраняется в памяти и освобождается только при создании нового списка с помощью функции path. Коды M- и MEX-файлов загружаются в память только при вызове соответствующей функции. Они удаляются из памяти:
    - при повторном вызове или обновлении;
    - при удалении командой clear;
    - при удалении командой clear <список функций>;
    - при завершение работы системы MATLAB.

Рекурсивный вызов функций. При использовании вложенных функций требуется тот же объём памяти, как при их последовательном вызове.

Пример
     При вызове следующих последовательностей функций требуется одинаковый объем памяти:

  1.  result = function2(function1(input99));
  2. result = function1(input99);
         result = function2(result);

Переменные и память. Память выделяется для переменной всякий раз, когда эта переменная не существует.

Для экономии памяти надо:

  • избегать использовать одни и те же переменные в качестве входных и выходных аргументов функции, поскольку они будут передаватся ссылкой;
  • после использования переменной целесообразно либо присвоить ей пустой массив, либо удалить с помощью команды clear имя переменной;
  • стремиться использовать переменные повторно.

Глобальные переменные. При объявлении глобальной переменной в таблицу переменных просто помещается флаг. При этом не требуется дополнительной памяти.

Например, последовательность операторов a = 5; global a определяет переменную a как глобальную и формируется дополнительная копия этой переменной.

Функция clear a удаляет переменную а из рабочей области системы MATLAB, но сохраняет её в области глобальных переменных.

Функция clear global a удаляет переменную а из области глобальных переменных.

Особенности платформы PC.

  • На этой платформе не реализованы функции управления ресурсами системы Windows. Windows использует системные ресурсы, чтобы контролировать шрифты, окна и объекты на экране. Ресурсы могут быть исчерпаны при использовании большого количества графических окон, шрифтов или управляющих элементов графического интерфейса пользователя. Лучший способ освободить ресурсы системы - закрыть все неактивные окна. Окна в виде иконок также используют ресурсы.
  • Эффективность постоянного файла для свопинга выше, чем временного.
  • Обычно размер файла подкачки, вдвое превышающий размер ОП, оказывается достаточным.

Предварительное выделение памяти для самых больших массивов позволяет оптимизировать использование доступной памяти.

Сообщение " Out of Memory". Обычно сообщение ‘Out of Memory - недостаточно памяти‘ появляется, когда система MATLAB запрашивает памяти больше, чем ей доступно в текущий момент. Для оптимизации доступной памяти необходимо воспользоваться одним или несколькими методами, перечисленными выше. Если и этого оказывается недостаточным, надо:

  • увеличить размер файла подкачки;
  • убедиться, что нет никаких внешних ограничений на использование памяти;
  • увеличить объём памяти системы;
  • уменьшить размер используемых данных.

  В оглавление книги \ К следующему разделу \ К предыдущему разделу \ Предметный указатель

 


Поиск по сайту:

Система Orphus

Яндекс.Метрика