for i=1:N
f(i) = 'f'+i;
end
видає помилку в MatLab. Який правильний синтаксис для ініціалізації масиву з N рядків шаблону fi?
Здається, навіть це не працює:
for i=1:4
f(i) = 'f';
end
Відповіді:
Ви можете об'єднати рядки за допомогою strcat. Якщо ви плануєте об'єднати числа як рядки, спочатку num2strпотрібно перетворити числа в рядки.
Крім того, рядки не можуть зберігатися у векторі або матриці, тому fїх слід визначати як масив комірок та індексувати за допомогою {та }(замість звичайних круглих дужок).
f = cell(N, 1);
for i=1:N
f{i} = strcat('f', num2str(i));
end
['f', num2str(i)]трохи коротший.
Одним простим підходом без циклу було б використовувати його 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.
genvarnameзастаріло.
Дозвольте додати ще одне рішення:
>> 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'
Використання sprintfбуло запропоновано ldueck у коментарі, але я думаю, що це варто бути відповіддю:
f(i) = sprintf('f%d', i);
На мою думку, це найбільш читабельне рішення, а також забезпечує деяку приємну гнучкість (тобто, коли ви хочете округлити плаваюче значення, використовуйте щось на зразок %.2f).
Спробуйте наступне:
for i = 1:4
result = strcat('f',int2str(i));
end
Якщо ви використовуєте це для іменування декількох файлів, які генерує ваш код, ви зможете об'єднати більше частин в ім'я. Наприклад, із розширенням в кінці та адресою на початку:
filename = strcat('c:\...\name',int2str(i),'.png');
fщоб виглядав масив ? Один рядок з усіма окремимиfiрядками, об’єднаними разом? Масив символів з одним рядком на рядок? Клітинний масив?