web-dev-qa-db-ja.com

文字列+ iを連結するには?

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

matLabでエラーが発生します。パターンfiのN個の文字列で配列を初期化する正しい構文は何ですか?

これでも機能していないようです:

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

strcat を使用して文字列を連結できます。数字を文字列として連結する場合は、最初に num2str を使用して数字を文字列に変換する必要があります。

また、文字列はベクトルまたは行列に格納できないため、fセル配列 として定義する必要があり、(通常の丸括弧ではなく){および}を使用してインデックスを付ける必要があります。

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

R2014aより前のバージョンの場合...

簡単な非ループアプローチの1つは、 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の長さが2桁を超える場合(>= 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);

私の意見では、これは最も読みやすいソリューションであり、ニースの柔軟性も提供します(つまり、float値を丸める場合は、%.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