2011-12-20 12 views
3

文字列のセル配列を作成したいと考えています:{'x_1', 'x_2', ..., 'x_n'}。私はnが先になることを知っています。次のように単純に私は、このセル・アレイを構築することがありますセル配列に数値文字列をすぐに入力してください

for i = 1:n 
    myCell{i} = sprintf('x_%d', i); 
end 

はこれを行うには、よりエレガントな方法、すなわち、ワンライナーはありますか?

+3

「ワンライナー」は、上記のコードよりもエレガントではないでしょう。 forループ内のセル配列のサイズが大きくなるため、効率が問題になる場合は、forループの前に 'myCell = cell(1、n)'を追加できます。 [アレイの事前割り当て](http://www.mathworks.com/help/techdoc/matlab_prog/f8-784135.html#f8-793781) – Kavka

答えて

5

あなたのコードが提供さ答えのいくつかよりも約3倍高速である:

% 
n = 1000; 
tic 
myCell = cell(1,n); 
for i = 1:n 
    myCell{i} = sprintf('x_%d', i); 
end 
toc 

tic 
aCell = arrayfun(@(x){sprintf('x_%d',x)},1:n); 
toc 

tic 
bCell = strcat('x_',cellstr(num2str((1:n)'))); 
toc 

tic 
cCell = strcat('x_',strtrim(cellstr(num2str((1:n)')))); 
toc 



>> Elapsed time is 0.011541 seconds. 
>> Elapsed time is 0.030992 seconds. 
>> Elapsed time is 0.027931 seconds. 
>> Elapsed time is 0.030453 seconds. 
1

まず、あなたが書いたような分かりやすいコードは、1つのライナーよりはるかに優れていると思います。しかし、あなたが主張する場合...

arrayfun(@(x){sprintf('x_%d',x)},1:n) 
1

別の方法です。あなたはそれがより明確かどうかを決定します。 ;)

strcat('x_',strtrim(cellstr(num2str((1:n)')))) 
+0

@yoda:誤植を編集してくれてありがとう。 – yuk

1

私はstrtrim()が必要ではないと思います。だから、少し単純:

strcat('x_',cellstr(num2str((1:n)'))) 
+2

'strtrim'は、文字列が有効なMATLAB式でなければならない場合に必要です:' strcat( 'x _'、cellstr(num1str([1; 1000]))) '' x_1 'と 'x_1000'を返します。 1の前のスペースに注意してください。 – Kavka

関連する問題