如何将字符串和 i 连接起来?

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

如何在MatLab中用N个fi字符串初始化数组? 如果使用类似下面的语法会报错,请问正确的语法是什么?

看起来即使使用以下语法也不起作用:

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

你想让数组 f 长成什么样子?是一个包含所有单独的 fi 字符串连接在一起的字符串吗?还是每行一个字符串的字符数组?或者是一个单元数组? - gnovice
对于最近版本的MATLAB,请使用字符串。例如,"asd" + (1:5) 就可以工作了。 - bonanza
6个回答

123
你可以使用strcat函数连接字符串。如果要将数字作为字符串连接,必须首先使用num2str将数字转换为字符串。

此外,字符串无法存储在向量或矩阵中,因此f必须被定义为cell数组,并且必须使用{}进行索引(而不是普通的圆括号)。

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)] 稍微短一些。 - Oli

24

对于早于 R2014a 版本的 MATLAB...

一种简单的非循环方法是使用 genvarname 函数创建一个字符串类型的 cell 数组

>> 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已被弃用。 - Czechnology

10

让我再添加一个解决方案:

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

5

在评论中,ldueck已提出使用sprintf的建议,但我认为这值得成为一个答案:

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

在我看来,这是最易读的解决方案,同时也提供了一些不错的灵活性(例如当您想要对浮点值四舍五入时,可以使用类似于%.2f的内容)。


2
根据这个链接所说的,貌似在使用之前需要设置“N”,而且看起来它需要是一个整数而不是字符串?虽然我对MatLab不是很了解,但这就是我从那个网站上搜集到的信息...希望这能有所帮助 :)

2
尝试以下操作:
for i = 1:4
    result = strcat('f',int2str(i));
end

如果您用它来命名代码生成的多个文件,您可以将更多的部分连接到名称中。例如,在末尾添加扩展名,在开头添加地址:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接