3

私は Octave/Matlab を初めて使用するので、これまでのところ、行列演算 ( など*) またはセルごとの演算 ( など.*) を適用できます。

今、私はこれらの 2 つのモードの間にある問題を抱えています。

たとえば、(これはちょうどEXAMPLEです) 行列 (10,10) とベクトル (10,1) があります。この行列をスライス (この場合は列スライス) で操作し、それらにベクトルを追加したいと思います。したがって、最初の列にベクトルを追加し、2 番目の列にベクトルを追加し、....、最後の列にベクトルを追加します。そして結果では、もちろん行列(10,10)を取得します。

これまでのところ、私は2つのアプローチを考え出しています:

  1. 列を手動でループし、ベクトルを追加します

  2. ベクトルを繰り返してから、繰り返されたベクトル全体(つまり、実際には行列です)を行列に追加します

2 つ目はベクトル化アプローチを使用しますが、大量のメモリを消費します。最初のケースでは、ベクトル化アプローチ (手動ループ) はありませんが、メモリは過度に使用されません。

質問-- 3 番目に優れたスライス モードはありますか? マトリックスをスライスとして表示し、ベクトルをスライスに追加し、そのようなビューをドロップして、マトリックスを通常どおりに扱うと言えますか?

4

1 に答える 1

5

Matlab の bult をバイナリ シングルトン展開 ( bsxfun ) で使用して、メモリ効率の良い方法で目的の結果を得ることができます。

x = ones(10); %// 10x10 matrix
y = 1:10; %// 10x1 matrix
z = bsxfun(@plus, x, y)

これにより、次の出力が得られます

z =

 2     3     4     5     6     7     8     9    10    11
 2     3     4     5     6     7     8     9    10    11
 2     3     4     5     6     7     8     9    10    11
 2     3     4     5     6     7     8     9    10    11
 2     3     4     5     6     7     8     9    10    11
 2     3     4     5     6     7     8     9    10    11
 2     3     4     5     6     7     8     9    10    11
 2     3     4     5     6     7     8     9    10    11
 2     3     4     5     6     7     8     9    10    11
 2     3     4     5     6     7     8     9    10    11

repmat コマンドの使用は一般的に無駄であり(質問で指摘したように)、通常は回避できます。bsxfun と repmat の詳細については、この記事を参照してください。

http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/

少なくとも乗算では、対角行列を含むトリックを使用して結果を得ることができます。sparse キーワードを使用して、対角行列の一時的なストレージのメモリ使用量を減らすことができます

x = ones(10); %// 10x10 matrix
y = 1:10; %// 10x1 matrix
yd = sparse(diag(y)); %// 10x10 matrix, but memory is only used to store data and its indicies

z =  yd * x %// 10x10 matrix

ただし、一般的には bsxfun ソリューションの方が優れています。

于 2012-04-26T10:51:52.803 に答える