MATLAB: загрузка изнутри функции - PullRequest
7 голосов
/ 21 февраля 2011

У меня есть функция MATLAB, которой нужен доступ к данным какого-то файла largeFile.mat. Если (чтобы не загрязнять глобальное пространство имен) я поместил команду загрузки в функцию, будет ли MATLAB перезагружать largeFile при каждом вызове функции, или он достаточно умен, чтобы кэшировать LargeFile между вызовами? Э.Г.

function hello()
    load largeFile.mat;
    display('hi');
end

for i=1:1000
    hello();
end

Должен ли я сохранить команду загрузки внутри функции или я должен сделать это один раз и передать данные большого файла в виде аргумента? Спасибо!

Ответы [ 2 ]

18 голосов
/ 21 февраля 2011

Решение от Ghaul (загрузка данных в структуру и передача их в качестве аргумента) - это то, что я бы обычно предложил, так как оно избегает необходимости жестко кодировать имена файлов / пути в ваши функции, что требует от вас редактировать вашу функцию каждый раз, когда меняется имя файла или местоположение.

Однако для полноты картины есть другое решение: используйте постоянные переменные . Это локальные переменные функции, которые сохраняют свои значения в памяти между вызовами функции. Для вашей ситуации вы можете сделать это:

function hello()
  persistent data;  %# Declare data as a persistent variable
  if isempty(data)  %# Check if it is empty (i.e. not initialized)
    data = load('largeFile.mat');  %# Initialize data with the .MAT file contents
  end
  display('hi');
end
6 голосов
/ 21 февраля 2011

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

L = нагрузка ('largeFile.mat');

РЕДАКТИРОВАТЬ: я провел быструю проверку вашей функции hello () и одного из моих файлов .mat. Загружая его внутри функции и выполняя его 100 раз, я использовал 43,29 секунды. Загрузка его один раз и выдача его в качестве входных данных заняла 0,41 секунды для 100 циклов, поэтому разница во времени огромна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...