Как сопоставить строку + я? - PullRequest
74 голосов
/ 07 декабря 2011
for i=1:N
   f(i) = 'f'+i;
end

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

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

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

Ответы [ 6 ]

116 голосов
/ 07 декабря 2011

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

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

f = cell(N, 1);
for i=1:N
   f{i} = strcat('f', num2str(i));
end
24 голосов
/ 07 декабря 2011

Для версий, предшествующих 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'
9 голосов
/ 07 мая 2014

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

>> 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'
4 голосов
/ 01 декабря 2016

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

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

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

2 голосов
/ 18 июня 2014

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

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

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

filename = strcat('c:\...\name',int2str(i),'.png'); 
2 голосов
/ 07 декабря 2011

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

...