Функция Концептуальная справка: Проверьте, существует ли переменная в рабочей области MATLAB - PullRequest
0 голосов
/ 05 марта 2020

Я застрял с этой очень простой функцией. Я делаю фундаментальную концептуальную ошибку, которую не вижу. Любая помощь будет очень признательна.

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

Минимальный воспроизводимый пример:

function workspace_variables_check(variable_to_check)
% Loop over all the Variables in the Workspace to get the all the variable names
workspace_variables = who('-regexp',variable_to_check);
if isempty(workspace_variables) % A variable by this name is present in the workspace
    disp('Absent in Workspace')
    output = 1 ;
else                            % A variable by this name is not present in the workspace
    disp('Present from Workspace')
    output = 0 ;
end

Пример: a = 1; б = 1; c = 1: d = 1:

Проверка функции:

workspace_variables_check('d')
workspace_variables_check('b')
workspace_variables_check('c')
workspace_variables_check('a')

Вывод функции:

Variable NOT Present

ans =

     0

Variable Present

ans =

     1

Variable Present

ans =

     1

Variable Present

ans =

     1

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Есть две проблемы с кодом:

1) Когда who вызывается функцией, она возвращает список переменных, доступных в рабочем пространстве функции, а не в базовой рабочей области. Если вы удалите точку с запятой из первой строки кода, вы увидите вывод функции:

workspace_variables = who('-regexp',variable_to_check)

Когда вы запустите функцию из командной строки, вы увидите, что функция имеет только одну переменную, когда эта строка выполняется, и эта переменная является входной переменной variable_to_check:

>> workspace_variables_check('b')

workspace_variables =

  1×1 cell array

  {'variable_to_check'}

Все переменные a, b, c et c находятся в «базовом» рабочем пространстве и являются отдельным функция не имеет к ним доступа. Понятие, какие переменные доступны для функции, называется scope . Вот ссылка на сообщение в блоге , в котором обсуждается область видимости в MATLAB.

2) Другая вещь, которая происходит, заключается в том, что та же строка кода выполняет регулярное выражение для имени переменных присутствует, это строка 'variable_to_check'. Таким образом, символы «a», «b», «c» соответствуют регулярному выражению, а «d» - нет. Таким образом, вы можете проверить загадочную переменную "v":

>> workspace_variables_check('v')

workspace_variables =

  1×1 cell array

  {'variable_to_check'}

Present from Workspace

Также "ch", "var" и др. c. Могу поспорить, что это сбивает с толку отладку:)

Если вы хотите, чтобы функция проверяла переменные в «базовом» рабочем пространстве (это то, что вы используете из командной строки), вы можете использовать это:

function output = workspace_variables_check(variable_to_check)
% Check to see if a variable exists in the Base Workspace

exist_string = sprintf('exist(''%s'')',variable_to_check);
workspace_variables = evalin('base',exist_string);

if workspace_variables == 1      % A variable by this name is present in the workspace
    disp('Present from Workspace')
    output = 1 ;
else                        % A variable by this name is not present in the workspace
    disp('Absent in Workspace')
    output = 0 ;
end
0 голосов
/ 05 марта 2020

Вы ищете функцию exist. Фактически вы хотите сделать следующее

if exist(variable_to_check,'var') == 1
% do something
end

Обратите внимание, что функция будет возвращать целочисленный код независимо от того, указали ли вы тип поиска (здесь 'var') или нет, но рекомендуется для скорости и ясности.

0 — name does not exist or cannot be found for other reasons. For example, if name exists in a restricted folder to which MATLAB® does not have access, exist returns 0.
1 — name is a variable in the workspace.
2 — name is a file with extension .m, .mlx, or .mlapp, or name is the name of a file with a non-registered file extension (.mat, .fig, .txt).
3 — name is a MEX-file on your MATLAB search path.
4 — name is a loaded Simulink® model or a Simulink model or library file on your MATLAB search path.
5 — name is a built-in MATLAB function. This does not include classes.
6 — name is a P-code file on your MATLAB search path.
7 — name is a folder.
8 — name is a class. (exist returns 0 for Java classes if you start MATLAB with the -nojvm option.)
...