2014-10-17 3 views
3

В Matlab при объявлении переменной как глобальной и ее сохранения с помощью команды save() переменная также является глобальной после загрузки .mat-файла в новый сеанс. Следующий код показывает, такое поведение:Сохранение глобальных переменных в Matlab

В начале, у меня нет никаких переменных:

>> who 
>> who global 

Тогда я создал глобальную переменную и сохранить его:

>> global settings 
>> settings.test = 1; 
>> who 

Your variables are: 

settings 

>> who global 

Your variables are: 

settings 

>> save('test.mat','settings'); 

После этого я очистить рабочее пространство и глобальные переменные (или начать новый сеанс Matlab)

>> clear 
>> clearvars -global 
>> who 
>> who global 

Когда я загружаю .mat file, переменная снова будет помечена как глобальная, даже если я не укажу ее сейчас.

>> load test.mat 
>> who 

Your variables are: 

settings 

>> who global 

Your variables are: 

settings 

>> clear 
>> who 
>> who global 

Your variables are: 

settings 

Есть ли способ предотвратить такое поведение?

Мне кажется, что «глобальный» флаг сохраняется с переменной. Это действительно полезно? Предположим, что мы отправили мне mat-файл с данными, где переменные объявлены глобальными. Даже при загрузке этого файла в функции он будет распространять данные в моем полном сеансе. Для меня это делает код Matlab очень уязвимым.

Заранее спасибо.

+0

Как насчет 'settings = load test.mat'? Это все еще «глобальное»? – Dan

+0

Нет, в этом случае настройки не будут глобальными, но это приведет к: settings.settings.test. – Nemesis

+1

Это считается гораздо лучшей практикой, хотя, поскольку он намного легче увидеть, откуда загружаются переменные, ... http://blogs.mathworks.com/loren/2012/01/13/best-practices-for-programming- matlab/вы делаете числа 7 и 9 в этом списке плохой практики:/ – Dan

ответ

1

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

foo = load('settings.mat'); 

Чтобы исправить глобальную проблему с минимальным воздействием на остальную часть коды, и то, что генерирует и который использует файл settings.mat, можно затем извлечь нужное поле:

foo = load('settings.mat'); 
settings = foo.settings; 

Это и устраняет глобальный атрибут, и объявляет, откуда происходит переменная параметров. (Что действительно помогает при выполнении неизбежной археологии кода позже).

+0

Да, вы правы. Существует несколько способов избежать этой проблемы. В принципе, я просто заинтересован в том, почему это вообще происходит или есть какая-то причина, по которой фактическое поведение полезно. Я изменил часть кода, используя '-struct' в команде save. – Nemesis

+1

Я бы предположил, что это артефакт 'save ('workspace.mat')' use case, который сохраняет всю рабочую область в файл. Я подозреваю, что за этим стоит думать, что это «дамп памяти», чем «сохранение переменных», поэтому сохранение всех атрибутов переменной имеет смысл. – Alan

+0

Хорошо, это возможно.В конце концов, мне просто потребовалось некоторое время, чтобы понять, что какое-то странное поведение моего кода было вызвано этой ** функцией **. – Nemesis

Смежные вопросы