Как я могу преобразовать строку, которая содержит имя переменной, в переменную, на которую можно ссылаться? - PullRequest
0 голосов
/ 26 апреля 2018

Я создаю функцию, которая сканирует файлы для определенной функции и определяет, какие переменные (все уже инициализированы) используются в качестве параметров для функции. В настоящее время я могу получить массив ячеек со строками для каждой отдельной переменной. Программа принимает это:

x = DummyFunction(a, b, c);

И возвращает это:

{'a'} {'b'} {'c'}

Я пытаюсь преобразовать эти строки, которые содержат предварительно установленные переменные, в переменные, которые могут быть вызваны. Есть предложения?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Попробуйте сохранить ваши переменные в структуре и использовать динамические ссылки на поля. Вот пример:

variables.a = 1;
variables.b = 2;
variables.c = 3;

% scan your file here
% let's assume a and b are found in the file
variables_present = ['a', 'c'];

for i = 1:length(variables_present)
    % use dynamic field reference
    disp(variables.(variables_present(i)))
end

Это даст результат:

1
3

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

0 голосов
/ 26 апреля 2018

Функция, которую вы ищете: matlab.lang.makeValidName (введена в R2014a):

N = matlab.lang.makeValidName(S) создает допустимые идентификаторы MATLAB®, N, из входных строк, S. Функция makeValidName не гарантирует, что строки в N являются уникальными.

Действительный идентификатор MATLAB - это символьный вектор буквенно-цифровых символов (A – Z, a – z, 0–9) и подчеркивания, так что первый символ является буквой, а длина символьного вектора меньше или равна namelengthmax.

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

Так, например:

>> matlab.lang.makeValidName(["_privateField", "some name"])

выходы:

ans = 

  1×2 string array

    "x_privateField"    "someName"

Я не уверен, что это применимо к вашему варианту использования, но вы можете посмотреть: Почему переменные не должны именоваться динамически (eval) .

Возможно, то, что вы действительно хотите сделать , это проверить, существуют ли переменные с определенными именами, а затем сделать что-то соответственно - в этом случае вы можете использовать функцию exist:

tf = exist('varName','var')

Так, например:

if exist('a','var') && exist('b','var')
  res = someFunction(a,b);
else
  res = someFunction(default_a,default_b);
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...