Допустим, у меня есть вектор с именем 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
и значением k
. Давайте сделаем t = max(v) / k
интервалов. Теперь, сколько значений из n
находится в интервале [0, t)? Как насчет [t, t * 2)? А как насчет [2*т, 3*т)? и т. д. До сих пор я использовал 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))
, для второй: sum(accumarray(v, 1)(17:32))
, но я не знаю, как векторизовать эту операцию. Я пробовал это: i = (1:16:500)
. Затем sum(accumarray(v, 1)(i(1:length(i)) : i(2:length(i)))
, но это не совсем работает или я использую не то.
arrayfun
сfind
, чтобы найти последний элементintervals
, строго меньший, чемx
, для всех вvect
, затемaccumarray
для подсчета. 22.03.2016intervals
упорядочено 23.03.2016intervals = 1:1.1:8; find(intervals < 5.3, 1, 'last')
23.03.2016