Использование Strcat для создания динамических имен переменных - PullRequest
2 голосов
/ 31 января 2012

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

Set_1 = zeros(dim, number);

vectors_1 = zeros(dim, number);

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 31 января 2012

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

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

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

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

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

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

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

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

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

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