2012-01-31 16 views
2

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

Set_1 = zeros(dim, number);

vectors_1 = zeros(dim, number); 

Для следующего набора данных мне нужно:

`Set_2 = .........` 

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

Сначала я попытался использовать strcat('Set_1',int2str(number)) = zeros(dim, number), но это не работает, я считаю, потому что это означает, что я пытаюсь установить массив как строку. Я уверен, что должен быть способ создать одну функцию и создать динамически динамические переменные, но, похоже, это вне меня, поэтому, вероятно, это совершенно очевидно, поэтому, если кто-то может сказать мне, что это будет здорово.

ответ

10

Я бы так не сделал. Это плохая привычка, лучше использовать массив ячеек или структуру для сохранения нескольких наборов. В поле есть небольшие накладные расходы (по размеру), но в дальнейшем их будет намного легче поддерживать.

Если вы действительно хотите сделать это, используйте eval на строчке, которую вы создали.

+0

Не могли бы вы подробнее объяснить, как использовать массив ячеек или тип данных структуры для имен динамических переменных? Я использовал это, чтобы пользователь задал имя переменной: eval ([var2n '=' num2str (var2v)]); где var2n - это строка, введенная пользователем. – pythonista

+3

Используйте конструкцию с меткой «dot-paren» для имен динамических полей. 's = struct; n = 12; var2v = '123.456'; var2n = sprintf ('foo_% d', n); s.(var2n) = num2str (var2v); ' –

+2

Или с использованием массива ячеек:' Sets = cell (nSets, 1); vectors = cell (nSets, 1); для k = 1: nSets, Set {k} = нули (dim, число); векторов {k} = нули (DIM, число); end' – jpjacobs

3

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

Если вы настаиваете на использовании eval, а затем использовать что-то вроде:

eval(sprintf('Set_1%d = zeros(dim, number);', number)) 
4

Функция MATLAB genvarname делает то, что вы хотите. В вашем случае это будет выглядеть примерно так:

eval(genvarname('Set_', who)) = zeros(dim, number); 

Однако, я бы следовать рекомендациям предыдущих ответов и использовать ячейку или структуры для хранения результатов.

Смежные вопросы