Как сопоставить строку + я?

57
for i=1:N
   f(i) = 'f'+i;
end

дает ошибку в MatLab. Какой правильный синтаксис для инициализации массива с N строками шаблона fi?

Кажется, что даже это не работает:

for i=1:4
  f(i) = 'f';
end
  • 0
    Как именно вы хотите, чтобы массив f выглядел? Одна строка со всеми отдельными fi строк объединяются вместе? Массив символов с одной строкой на строку? Клеточный массив?
  • 0
    f = 'f1', 'f2', 'f3', 'f4'
Показать ещё 1 комментарий
Теги:
string
for-loop
loops
octave

6 ответов

96
Лучший ответ

Вы можете объединить строки, используя strcat. Если вы планируете конкатенировать числа в виде строк, вы должны сначала использовать num2str для преобразования чисел в строки.

Кроме того, строки не могут быть сохранены в векторе или матрице, поэтому f должен быть определен как массив , и должен индексироваться с помощью { и } (вместо обычных круглых скобок).

f = cell(N, 1);
for i=1:N
   f{i} = strcat('f', num2str(i));
end
  • 10
    Что-то вроде "f (i) = sprintf ('% s% d', f, i);" будет работать так же.
  • 0
    моей проблемой было отсутствие использования фигурных скобок для индексации
Показать ещё 1 комментарий
23

Для версий до R2014a...

Один простой подход без петли заключался бы в использовании genvarname для создания массив ячеек строк:

>> N = 5;
>> f = genvarname(repmat({'f'}, 1, N), 'f')

f = 

    'f1'    'f2'    'f3'    'f4'    'f5'

Для более новых версий...

Функция genvarname устарела, поэтому matlab.lang.makeUniqueStrings можно использовать следующим образом, чтобы получить тот же результат:

>> N = 5;
>> f = strrep(matlab.lang.makeUniqueStrings(repmat({'f'}, 1, N), 'f'), '_', '')

 f =
   1×5 cell array

     'f1'    'f2'    'f3'    'f4'    'f5'
  • 0
    Это на самом деле отличное решение. Я не знал о genvarname .
  • 0
    К вашему сведению: genvarname устарело.
Показать ещё 1 комментарий
7

Позвольте мне добавить еще одно решение:

>> N = 5;
>> f = cellstr(num2str((1:N)', 'f%d'))
f = 
    'f1'
    'f2'
    'f3'
    'f4'
    'f5'

Если N длиннее двух цифр (>= 10), вы начнете получать дополнительные пробелы. Добавьте вызов strtrim(f), чтобы избавиться от них.


В качестве бонуса существует недокументированная встроенная функция sprintfc, которая прекрасно возвращает массивы ячеек строк:

>> N = 10;
>> f = sprintfc('f%d', 1:N)
f = 
    'f1'    'f2'    'f3'    'f4'    'f5'    'f6'    'f7'    'f8'    'f9'    'f10'
1

Использование sprintf уже было предложено ldueck в комментарии, но я думаю, что это стоит того, чтобы ответить:

f(i) = sprintf('f%d', i);

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

1

Попробуйте следующее:

for i = 1:4
    result = strcat('f',int2str(i));
end

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

filename = strcat('c:\...\name',int2str(i),'.png'); 
1

в соответствии с это, похоже, вам нужно установить "N" перед тем, как попытаться использовать его, и похоже, что он должен быть int не строка? Не знаю много бит MatLab, но только то, что я собрал с этого сайта. Надеюсь, он помогает:)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню