0

vect = [1 2 3 4 5 6 7 8 9]という名前のベクトルと という名前の別のベクトルがあるとしましょうintervals = [1 3 6 9]vestを使用して、の要素の部分和の別のベクトルを取得することは可能intervalsですか? 私はこのようなことをしたい:

部分和 1 = 1 + 2 + 3 ( からvect(1)までの要素vect(3))

部分和 2 = 4 + 5 + 6 ( からvect(3 + 1)までの要素vect(6))

部分和 3 = 7 + 8 + 9 ( からvect(6 + 1)までの要素vect(9))

だから私がやりたいのは、最初の要素の合計を取得してから、前の合計にない最初の要素から始まるk別の要素の合計などを取得することです.k

元の問題:n元の問題は次のようなものでした:値と値を 持つベクトルを受け取りますkt = max(v) / kインターバルを取りましょう。さて、n間隔 [0, t) には からの値がいくつありますか? [t, t * 2) はどうでしょうか? [2 * t, 3 * t) はどうでしょうか? 等々。これまでは、accumarray(v, 1)それぞれの値の数を見つけてint = (0:max(v)/k:max(v))、間隔​​ベクトルを作成していましたが、今ではsum(accumarray(v, 1))部分和を取得する必要があります。

これを使用してテストしたい場合 ( http://pastebin.com/jCZ3qYhz : で生成accumarray) とk = 16、部分和は次のようにする必要があります: 157, 167, 136, 251, 726, 1300, 1152.. for/while ループなしでこれを実行できるようにするには:) ベクトル化が鍵です!

編集: 最初の合計を取得するには、これを使用します: sum(accumarray(v, 1)(1:16))、2番目の合計には: を使用しますsum(accumarray(v, 1)(17:32))が、この操作をベクトル化する方法がわかりません。私はこれを試しました:i = (1:16:500)。しかしsum(accumarray(v, 1)(i(1:length(i)) : i(2:length(i)))、実際には機能していないか、正しいものを使用していません。

4

1 に答える 1

1

最初の問題では、これを使用します:

cs = cumsum(vect);
i2 = intervals(2:end);
result = [cs(i2(1)), diff(cs(i2))]

result =

     6    15    24

これにより、すべての要素の累積合計が作成され、パーツの端が検出され、パーツの端での合計の差が検出されます (これは、正確にはその間の要素の合計です)。

于 2016-03-21T04:00:24.140 に答える