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
рядками, об’єднаними разом? Масив символів з одним рядком на рядок? Клітинний масив?