2013-03-24 67 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