3

行列 X の各行で数式を計算するために使用している for ループを削除することで、Octave をより効率的に使用できるかどうかを理解しようとしています。

myscalar = 0
for i = 1:size(X, 1),
  myscalar += X(i, :) * y(i) % y is a vector of dimension size(X, 1)
  ...

式は、スカラーに追加するよりも複雑です。ここでの問題は、インデックスなしで X 行を反復処理して、for ループをなくす方法です。

4

1 に答える 1

7

はい、これにはブロードキャストを使用できます (3.6.0 以降が必要です)。あなたがpythonを知っているなら、これは同じです(pythonからの説明)。行列に列を掛けるだけです。最後に足し算を行いますが、必要なcumsumのは最後の行だけです。

newx      = X .* y;
myscalars = cumsum (newx, 1) (end,:);

または一時変数なしで1行で

myscalars = cumsum (X .* y, 1) (end,:);

サイズが合っていれば、自動的にブロードキャストが行われます。例えば:

octave> a = [ 1 2 3
              1 2 3
              1 2 3];
octave> b = [ 1 0 2];
octave> a .* b'
warning: product: automatic broadcasting operation applied
ans =

   1   0   6
   1   0   6
   1   0   6

octave> a .* b
warning: product: automatic broadcasting operation applied
ans =

   1   2   3
   0   0   0
   2   4   6

警告の理由は、ユーザーを混乱させる可能性のある新しい機能であり、Matlab には存在しないためです。ファイルに追加warning ("off", "Octave:broadcast")することで、永久にオフにすることができます.octaverc

古いバージョンの Octave を使用している場合は、bsxfun直接呼び出すことで同じことができます。

myscalars = cumsum (bsxfun (@times, X, y), 1) (end,:);
于 2012-09-09T17:00:09.573 に答える