it-roy-ru.com

Как сопоставить строку + я?

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

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

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

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

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

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

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

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

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

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

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

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

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

4
luator

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

2
Andres

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

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

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

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