web-dev-qa-db-ja.com

特定の値でマトリックスのすべてのエントリを初期化するにはどうすればよいですか?

Haskell で、数字5だけを含む10個の要素のリストを取得したい場合、次のようなことができます。

take 10 $ repeat 5

出力:

[5,5,5,5,5,5,5,5,5,5]

Matlabにはこのようなものがありますか?

40
Tyler

繰り返し値を配列に割り当てるのは簡単です:

x(1:10) = 5;

ステートメントで要素の配列をインラインで生成する場合は、次のようなものを試してください。

ones(1,10) * 5

または repmat

repmat(5, 1, 10)
65
dkantowitz

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. 

そして、私の意見では、はるかに読みやすいコードになります。

22
MatlabSorter

ドキュメントの repmat を参照してください。

B = repmat(5,1,10)
5
zellus

事前定義済みの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による乗算
5

他の回答で述べたように、次を使用できます。

>> 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.
0
bluefocs