Як concat рядок + i?


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

видає помилку в MatLab. Який правильний синтаксис для ініціалізації масиву з N рядків шаблону fi?

Здається, навіть це не працює:

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

Як саме ви хочете, fщоб виглядав масив ? Один рядок з усіма окремими fiрядками, об’єднаними разом? Масив символів з одним рядком на рядок? Клітинний масив?
gnovice

Для останньої версії MATLB використовуйте рядки. Наприклад "asd" + (1:5)працює тоді.
bonanza

Відповіді:


117

Ви можете об'єднати рядки за допомогою 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);" також буде працювати.
telenachos

моєю проблемою було відсутність використання фігурних дужок для індексації
simpatico

10
['f', num2str(i)]трохи коротший.
Олі

24

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

Це насправді чудове рішення. Я цього не знав genvarname.
Mansoor Siddiqui

FYI: genvarnameзастаріло.
Чехологія

9

Дозвольте додати ще одне рішення:

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

Використання sprintfбуло запропоновано ldueck у коментарі, але я думаю, що це варто бути відповіддю:

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

На мою думку, це найбільш читабельне рішення, а також забезпечує деяку приємну гнучкість (тобто, коли ви хочете округлити плаваюче значення, використовуйте щось на зразок %.2f).


2

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


2

Спробуйте наступне:

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

Якщо ви використовуєте це для іменування декількох файлів, які генерує ваш код, ви зможете об'єднати більше частин в ім'я. Наприклад, із розширенням в кінці та адресою на початку:

filename = strcat('c:\...\name',int2str(i),'.png'); 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.