Как получить значение структуры Simulink из рабочей области в функции MATLAB?

Мне нужно получить доступ к значениям переменных в рабочей области MATLAB типа Simulink.parameter:

CAL_vars = dsdd('find','/path/CAL','ObjectKind','Variable','Property',{'name' 'Class' 'value' 'CAL'}) 
%gets ids of variables in data dictionary
i = 10
for i=1:length(CAL_vars)
       var_name = dsdd('GetAttribute',CAL_vars(i),'name');
       % gets names of variables in data dict
       var_eval = eval(var_name); % this works in standalone script and it does exactly 
       % what I need, but once i put it in the function I need this for, it returns error
       if (length(var_eval.Value) ==1)
           if (var_eval.Value == true)
               var_eval.Value = 1;
           elseif (var_eval.Value == false)
               var_eval.Value = 0;
           else
           end
       end
       % do something with the Value
       if (errorCode ~= 0)
          fprintf('\nSomething is wrong at %s\n', var_name)
       end
end

Проблема возникает из-за того, что структуры созданы Simulink и дают ошибку, когда я пытаюсь вызвать eval(name_of_var): неопределенная функция 'eval' для входных аргументов типа 'Simulink.Parameter'.

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

Error using eval
Undefined function or variable 'name_of_var'.

Функция явно находится в рабочей области.


person user145760    schedule 23.07.2018    source источник
comment
Я правильно вас понимаю: вы хотите получить доступ к структурам из Simulink в рабочей области Matlab?   -  person avermaet    schedule 23.07.2018
comment
Я не знаю, верна ли моя терминология - я новичок в Matlab, за исключением некоторых небольших проектов в университете. В рабочей области Matlab есть некоторые переменные, которые (я думаю) были сгенерированы Simulink - теперь при дальнейшем рассмотрении кажется, что это объекты типа Simulink.Parameter. Я отредактирую вопрос. Извините за путаницу.   -  person user145760    schedule 23.07.2018
comment
Опубликуйте свой dsdd()   -  person avermaet    schedule 23.07.2018
comment
Это часть более крупного проекта, поэтому я не могу публиковать какие-либо подробности в Интернете, но я проверил все, что касается этого, и он возвращает правильные имена переменных, как и ожидалось. Я совершенно уверен, что суть проблемы заключается в использовании eval для параметров Simulink.   -  person user145760    schedule 23.07.2018


Ответы (1)


Любопытно, что он работает правильно в автономном скрипте, но как только я подключаю его к более крупной функции, он перестает работать.

Это ожидаемое поведение. Функция имеет собственное рабочее пространство и может не имеют прямого доступа к переменным в базовой рабочей области.

Вы можете попробовать использовать evalin вместо eval и указать рабочее пространство base :

evalin(ws, expression) выполняет expression, вектор символов или строковый скаляр, содержащий любое допустимое выражение MATLAB® с использованием переменных в рабочей области ws. ws может иметь значение 'base' или 'caller' для обозначения базового рабочего пространства MATLAB или рабочего пространства вызывающей функции.

Однако в целом существует множество причин, по которым следует избегать использования eval, если это вообще возможно (см. справку по MATLAB для eval), и было бы лучше, если бы вы могли найти другой способ получения этих данных.

person nekomatic    schedule 24.07.2018
comment
Большое тебе спасибо. Я новичок в Matlab и не знал, что существует отдельное рабочее пространство. Я тоже сегодня разобрался. К сожалению, в этом случае eval был единственным жизнеспособным вариантом, поскольку я работал с кодом из более крупного проекта и не имел большого права голоса при создании указанных данных. - person user145760; 24.07.2018