2015-08-10 2 views
3

Если существует вектор, как это,
Частичная сумма подразделений вектора

T = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16] 

(размер вектора Т может быть гибким)

Как я могу получить массив «сумма подразделений?

Например,

fn(T, 5) = [ (1+2+3+4+5) , (6+7+8+9+10), (11+12+13+14+15) , 16] 
+0

Добро пожаловать в StackOverflow! Пожалуйста, подумайте о принятии одного из ответов, чтобы отметить вашу проблему как решение. Спасибо! – thewaywewalk

ответ

6

Один из вариантов, который не требует заполнения нулей на исходном массиве, является использованием accumarray и ceil:

div = 5; 
out = accumarray(ceil((1:numel(T))/div).',T(:)) 

Другим вариантом использование cumsum и diff вместо:

div = 5; 
T(ceil(numel(T)/div)*div) = 0; 
cs = cumsum(T) 
out = diff([0 cs(div:div:end) ]) 

Редактировать: После того, как заполнение выполнено, cumsum и diff немного переборщит, и следует действовать как в Bentoy's answer.

4

Существует встроенную функция vec2mat в Communications System Toolbox для преобразования вектора в 2D-матрицу, порезов отключается через каждые N элементов и помещают в отдельные строки, дополняя остаточному место в конце нулей, чтобы поддерживать 2D размер , Таким образом, после использования vec2mat суммирование всех строк будет достаточно, чтобы дать вам желаемый результат. Вот реализация -

sum(vec2mat(T,5),2) 

Пример запуска -

>> T = 1:16; 
>> vec2mat(T,5) 
ans = 
    1  2  3  4  5 
    6  7  8  9 10 
    11 12 13 14 15 
    16  0  0  0  0 
>> sum(vec2mat(T,5),2) 
ans = 
    15 
    40 
    65 
    16 
+0

требует ** Коммуникационные системы Toolbox **. – thewaywewalk

+1

@thewaywewalk Yup! Это одно из требований, добавил эту информацию. – Divakar

5

Другой путь, близкий к 2 варианта thewaywewalk:

div = 5; 
T(ceil(numel(T)/div)*div) = 0; 
out = sum(reshape(T,div,[])).'; % transpose if you really want a column vector 

Кроме того, один раствор один вкладыш (я предпочитаю это один):

out = blockproc(T,[1 5], @(blk) sum(blk.data), 'PadPartialBlocks',true); 

Не забудьте установить параметр «PadPartialBlocks», это ключ к предотвращению явного заполнения.

+0

Вы совершенно правы, после этапа заполнения, 'cumsum' и' diff' переполнены! – thewaywewalk