文字列のセル配列を作成したいと考えています:{'x_1', 'x_2', ..., 'x_n'}
。私はn
が先になることを知っています。次のように単純に私は、このセル・アレイを構築することがありますセル配列に数値文字列をすぐに入力してください
for i = 1:n
myCell{i} = sprintf('x_%d', i);
end
はこれを行うには、よりエレガントな方法、すなわち、ワンライナーはありますか?
文字列のセル配列を作成したいと考えています:{'x_1', 'x_2', ..., 'x_n'}
。私はn
が先になることを知っています。次のように単純に私は、このセル・アレイを構築することがありますセル配列に数値文字列をすぐに入力してください
for i = 1:n
myCell{i} = sprintf('x_%d', i);
end
はこれを行うには、よりエレガントな方法、すなわち、ワンライナーはありますか?
あなたのコードが提供さ答えのいくつかよりも約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つのライナーよりはるかに優れていると思います。しかし、あなたが主張する場合...
arrayfun(@(x){sprintf('x_%d',x)},1:n)
別の方法です。あなたはそれがより明確かどうかを決定します。 ;)
strcat('x_',strtrim(cellstr(num2str((1:n)'))))
@yoda:誤植を編集してくれてありがとう。 – yuk
私はstrtrim()
が必要ではないと思います。だから、少し単純:
strcat('x_',cellstr(num2str((1:n)')))
'strtrim'は、文字列が有効なMATLAB式でなければならない場合に必要です:' strcat( 'x _'、cellstr(num1str([1; 1000]))) '' x_1 'と 'x_1000'を返します。 1の前のスペースに注意してください。 – Kavka
「ワンライナー」は、上記のコードよりもエレガントではないでしょう。 forループ内のセル配列のサイズが大きくなるため、効率が問題になる場合は、forループの前に 'myCell = cell(1、n)'を追加できます。 [アレイの事前割り当て](http://www.mathworks.com/help/techdoc/matlab_prog/f8-784135.html#f8-793781) – Kavka