Объявление глобальной переменной в MATLAB

32

Есть ли способ объявить глобальные переменные в MATLAB?

Пожалуйста, не отвечайте:

global x y z;

Потому что я также могу читать файлы справки.

Я объявил глобальную переменную x, а затем сделал что-то вроде этого:

function[x] = test()
    global x;
    test1();
end

Если функция test1() определяется как:

function test1()
    x = 5;
end

Когда я запускаю test(), мой вывод x = []. Есть ли способ заставить его выводить x=5 или что-то, что я определяю x, чтобы быть в отдельной функции? В C это будет внешняя переменная, и я думал, что сделать ее глобальной переменной должно выполнить именно это...

  • 7
    +1 за возможность чтения файлов справки, по крайней мере, до тех пор, пока не будет написано: `Однако, если несколько функций и, возможно, базовое рабочее пространство, все объявят определенное имя как глобальное, все они совместно используют одну копию этой переменной.
Теги:
global-variables

3 ответа

44
Лучший ответ

Вам нужно объявить x как глобальную переменную в каждой области (т.е. функции/рабочей области), в которой вы хотите, чтобы, Итак, вам нужно написать test1 как:

function test1()
  global x;
  x = 5;
end
  • 19
    Это правильно. Тем не менее, ответ на вопрос «Как я должен использовать глобалы на языке X» почти всегда «не»
  • 4
    @KitsuneYMG: Согласен. Глобальные переменные не очень красивы и являются большой болью, чтобы отслеживать, но в редких случаях может быть необходимым злом. Если бы я знал больше о конкретной ситуации ОП (я думаю, что выше это упрощенный пример), я мог бы предложить лучший подход.
Показать ещё 5 комментариев
4

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

Прежде всего убедитесь, что ваши файлы .m являются функциями, а не скриптами. Скрипты разделяют общую рабочую область, что позволяет легко перезаписывать переменные. Напротив, функции имеют свой собственный охват.

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

  • 0
    Спасибо за ваш ответ. То, что вы сказали, определенно верно, +1. Вместо того, чтобы использовать глобальные переменные, я теперь использую возвращаемое значение функции и устанавливаю его равным тому, что я хочу в основной функции. Это чертовски хорошо работает, и это то, к чему я стремился изначально, хотя я не знал, как выполнить такие задачи. Теперь все работает прекрасно, спасибо!
1

Возможный способ обойти беспорядок global - назначить переменную как appdata. Вы можете использовать функции setappdata и getappdata для назначения и извлечения appdata из окна MATLAB. Пока активен сеанс MATLAB, существует окно, обозначенное 0.

>> setappdata(0,'x',10)  % 0 indicates the root MATLAB window

Теперь переменная x не видна ни в какой script или функции, но может быть доступна там, где это необходимо, с помощью getappdata.

function test
    globalX = getappdata(0,'x');
    disp(globalX);
end

x =
    10

Хорошей новостью является то, что вы можете назначить любой действительный объект MATLAB для appdata, просто будьте осторожны с именами, используя уникальные имена для полей appdata, например ModelOptimizerOptions вместо общего x, y, чтобы помочь, Это работает на скомпилированных исполняемых файлах и коде, развернутых на сервере производства MATLAB.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню