2017-02-01 7 views
4

私は現在、自分のコードを高速化する必要があるため、ループの代わりにベクトル化を使用したいと考えています。次のコードは、私の計算中に多くのことを呼び出されるコードの(非常に)単純化したバージョンです:私はベクトル化を使用しようとしましたが、残念ながら私の唯一の最初のエントリとして動作するようには思えないベクトル化とベクトルインデックス

T=10; n=5; w0 = 25000; w1 = 23000; b0 = 15000; 
    vec = zeros(1,T+2*n+1); vec(1:n+1) = w0; vec(n+2:n+T+1) = b0; vec(n+T+2:T+2*n+2) = w1; 
    ref0=zeros(1,n); 
    for i = 1:n 
     ref0(i) = sum(vec(T+i+2:n+T+i+2)); 
    end 

i = 1:n; 
ref1 = sum(vec(T+i+2:n+T+i+2)); 

出力は以下の通りである:私は、ベクトルのインデックス作成プロセスの入力として使用されるベクトル

ref0 = 

    106000  114000  122000  130000  138000 

ref1 = 

    106000 

はREF1が同じ出力を与えることを達成する方法はありますベクトル化を使ってref0?それは非常に明白かもしれませんが、私はここでさらに得意ではありません。私はどんな助けにも感謝しています!ありがとうございます。

+2

これは、コロン演算子 ':'はベクトルを入力として受け入れず、代わりにベクトル入力の最初の要素のみを使用します – Suever

+3

Vecotrizationは必ずしも高速であるとは限りません。あなたのコードをプロファイルしましたか? –

+0

'vec'は' T + 2 * n + 1'列に初期化され、 '2 * n + T + 2'列には値が割り当てられます...ベクトル化の問題ではなく、 – Wolfie

答えて

5

かわりに、あなたのループのmovsumを使用することができます。

ref1 = movsum(vec(T+3:T+2*n+2),n+1,'Endpoints','discard'); 
+0

ありがとう!これはトリックをするようです;) – banan

2

コンボリューションも動作します:

c = conv(ones(1,n+1), vec(T+3:2*n+T+2), 'same'); 
ref2 = c(1:end-1); 
4

nTが小さい値を持っているとvecが長いベクトルである場合、これは、かなり効率的にする必要があります:

ref1 = cumsum(vec); 
ref1 = ref1(T+n+3:end) - ref1(T+2:end-n-1); 
+0

upvoteそれはmovsumとは異なる関数ですが、特に大きなベクトル "vec"の場合、movsumを使用すると遅くなります。なぜなら、2行目も簡単な操作ではないからです。 Matlabの誰かが多分それの楽しみのためのいくつかのタイミングを与えることができます。 –