Haskell で、数字5だけを含む10個の要素のリストを取得したい場合、次のようなことができます。
take 10 $ repeat 5
出力:
[5,5,5,5,5,5,5,5,5,5]
Matlabにはこのようなものがありますか?
繰り返し値を配列に割り当てるのは簡単です:
x(1:10) = 5;
ステートメントで要素の配列をインラインで生成する場合は、次のようなものを試してください。
ones(1,10) * 5
または repmat
で
repmat(5, 1, 10)
Onesメソッドは、repmatを使用するよりもはるかに高速です。
>> tic; for i = 1:1e6, x=5*ones(10,1); end; toc
Elapsed time is 3.426347 seconds.
>> tic; for i = 1:1e6, y=repmat(5,10,1); end; toc
Elapsed time is 20.603680 seconds.
そして、私の意見では、はるかに読みやすいコードになります。
ドキュメントの repmat を参照してください。
B = repmat(5,1,10)
事前定義済みのm-by-n
マトリックスサイズとターゲット値val
を指定すると、次の例のようになります。
m = 1;
n = 10;
val = 5;
現在、私の頭に浮かぶ7
さまざまなアプローチがあります。
1) repmat 関数を使用する(0.094066秒)
A = repmat(val,m,n)
2)割り当てられた未定義の行列のインデックス付け(0.091561秒)
A(1:m,1:n) = val
3) ones 関数を使用したターゲット値のインデックス付け(0.151357秒)
A = val(ones(m,n))
4)完全割り当てのデフォルト初期化(0.104292秒)
A = zeros(m,n);
A(:) = val
5) ones 関数と乗算の使用(0.069601秒)
A = ones(m,n) * val
6) zeros 関数を追加して使用する(0.057883秒)
A = zeros(m,n) + val
7) repelem 関数を使用する(0.168396秒)
A = repelem(val,m,n)
各アプローチの説明の後、括弧内で、Matlab 2017a
の下で、100000
の反復で対応するベンチマークを実行しました。勝者は6th
アプローチであり、これは私を驚かせません。
説明は簡単です:割り当ては一般にメモリのゼロで満たされたスロットを生成します...したがって、行列のすべてのメンバーにval
を追加することを除いて、他の操作は実行されません。とても短いです。
5th
アプローチについても同じことが言えません。これは、入力引数のサニタイズプロセスが基本的に同じであるにもかかわらず、メモリ側で2つではなく3つの操作が実行されているためです。
1
への変換val
による乗算他の回答で述べたように、次を使用できます。
>> tic; x=5*ones(10,1); toc
Elapsed time is 0.000415 seconds.
さらに高速な方法は次のとおりです。
>> tic; x=5; x=x(ones(10,1)); toc
Elapsed time is 0.000257 seconds.