Как объединить строку + i?


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

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

похоже, даже это не работает:

for i=1:4
  f(i) = 'f';
end
6 67

6 ответов:

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

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

f = cell(N, 1);
for i=1:N
   f{i} = strcat('f', num2str(i));
end

для версий до 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'

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

>> 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'

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

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

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

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

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

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

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

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