Как инициализировать переменные и сделать их доступными в консоли? - PullRequest
2 голосов
/ 24 января 2012

Например, в testinit.m у меня есть следующее

function [x, y, m] = testinit

x=4
y=3
m=2

Когда я запускаю testinit в консоли, он правильно отображает значение. Однако, когда я печатаю x, он говорит

ошибка: 'x' не определено ...

Ответы [ 5 ]

4 голосов
/ 24 января 2012

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

P.S Если вы написали m-файл, который не является функцией, то переменные являются глобальными.

3 голосов
/ 24 января 2012

Есть функция assignin (evalin относится).А также global.

2 голосов
/ 24 января 2012

Другие ответы - все возможные решения, но потенциально более сложные, чем то, что вы, возможно, ищете. Я думаю, что первая часть ответа Юка посвящена реальной проблеме, с которой вы столкнулись, но я думаю, что она заслуживает более подробного объяснения ...

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

[x, y, m] = testinit;

Тогда вам будут доступны три выходных значения. То, что вы, вероятно, делали, печатали так:

testinit;

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

Это результат того, как переменные хранятся в MATLAB, как описано в документации для области действия переменных :

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

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

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

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

function [a, b, c] = testinit
  a = 4;
  b = 3;
  c = 2;

Вы можете сделать этот вызов в командном окне:

[x, y, m] = testinit;

И вы получите x = 4, y = 3 и m = 2.

2 голосов
/ 24 января 2012

Если вы запускаете [x, y, m] = testinit в консоли, вы должны получить переменные.Выходные переменные могут иметь любое разрешенное имя, необязательно x, y и m.

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

Если вы хотите просто инициализировать новые переменные, просто набрав testinit, используйте assignin, как в ответе @ BenVoigt.

assignin('base','x',4)

Однако это опасно, поскольку некоторая переменная может уже существовать в вызывающей среде и будет перезаписана.Вы можете избежать этого, добавив тесты EXIST (внутри EVALIN):

function testinit

if ~evalin('base','exist(''x'',''var'')')
    assignin('base','x',4)
end
if ~evalin('base','exist(''y'',''var'')')
    assignin('base','y',3)
end
if ~evalin('base','exist(''m'',''var'')')
    assignin('base','m',2)
end

Вы также можете использовать 'caller' вместо 'base', если вы планируете вызывать функцию из другой функции.

1 голос
/ 24 января 2012

Переменные являются локальными для функции, поэтому вы не можете получить к ним доступ из командной строки. Как сказал @BenVoigt, вы можете использовать asignin, но это очень грязно, и я не думаю, что это то, что вы действительно хотите сделать.

Я советую вам перейти в Режим отладки

Добавьте break point или keyboard к вашей функции следующим образом:

function [x, y, m] = testinit

x=4
y=3
m=2

keyboard

После выполнения вашей функции и командная строка останется в среде функции. Обычное >> kill будет заменено на K>>. В этот момент вы можете получить доступ ко всем вашим локальным переменным.

Для выхода из режима отладки введите dbquit или нажмите shift+F5

...