2013-03-24 2 views
1

Может ли кто-нибудь предложить способ, которым можно выполнять операции над вектором в соответствии с заданной последовательностью - например, у меня есть вектор разных значений, M, который равен < 8760x1> в размере. У меня есть еще один вектор с последовательностью чисел, P, (размер < 300x1>), и эта последовательность суммируется до 8760. Я хотел бы использовать эти значения P для индексации вектора M и найти произведение каждого индекса.Разделить вектор в соответствии с определенной последовательностью

В качестве примера, чтобы сделать это более ясным:

М = ​​[1,2,4,2,3,4,5,3,4,2];

P = [2,2,4,2];

Result = [3,6,15,6]

Любая помощь здесь будет весьма признателен.

Peter.S.

+1

Я не понимаю, что вы хотите сделать. Чтобы использовать P в качестве индекса для M, используйте M (P). Это даст вам [2, 2, 2, 2] в вашем примере. Откуда появился продукт? – Molly

+0

Извинения Я неправильно использовал термин index. Я хотел найти Result, который дает значение M (1,1) + M (1,2) = 3, то M (1,3) + M (1,4) = 6, то M (1,5) + M (1,6) + M (1,7) + M (1,8) = 15 и M (1,9) + M (1,10) = 6. – user2105201

+0

Для этого можно использовать следующие коды: M = [1,2,4,2,3,4,5,3,4,2]; P = [2,2,4,2]; id2 = cumsum (P); id1 = [1 id2 (1: end-1) +1]; для k = 1: numel (id1) Результат (k) = сумма (M (id1 (k): id2 (k))); конец % или id2 = cumsum (P); id1 = [1 id2 (1: end-1) +1]; Результат = массивfun (@ (x, y) sum (M (x: y)), id1, id2) – user2105201

ответ

1

Это способ, основанный на acummarray и умный способ сделать индексный вектор, используя cumsum. Учитывая два вектора:

M = [1,2,4,2,3,4,5,3,4,2]; 
P = [2,2,4,2]; 

Создать вектор уникальных индексов на значение частоты в P (после этого SO поста):

numM = sum(P); 
index = zeros(numM, 1); 
index(cumsum([1 P(1:end-1)])) = 1; 
index = cumsum(index); 

>> index' 
ans = 
    1  1  2  2  3  3  3  3  4  4 

Нанести accumarray() с помощью сконструированного вектора индекса и вектор значений:

result = accumarray(index, M); 

>> result' 
ans = 
    3  6 15  6 
Смежные вопросы