2013-03-24 47 views
1

任何人都可以提出一种方法,可以根据预定的顺序在一个向量上执行操作 - 例如我有一个向量不同的值M,它是< 8760x1>在尺寸方面。我有另一个具有数字序列P(大小为< 300x1>)的向量,并且此序列总和为8760.我想使用这些P值为向量M编制索引并找到每个索引的乘积。根据定义的序列分割一个向量

一个例子,使之更清楚:

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

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

结果= [3,6,15,6]

这里任何帮助,将不胜感激。

Peter.S。

+1

我不明白你想要做什么。使用P作为M的索引使用M(P)。这会在你的例子中给你[2,2,2,2]。产品从哪里来? – Molly 2013-03-24 23:27:33

+0

道歉我已经错误地使用了术语索引。我想找到给出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 2013-03-24 23:39:58

+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)= sum(M(id1(k):id2(k))); end %or id2 = cumsum(P); id1 = [1 id2(1:end-1)+1]; 结果= arrayfun(@(x,y)sum(M(x:y)),id1,id2) – user2105201 2013-03-24 23:47:58

回答

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