2013-06-24 2 views
0

Если у меня есть столбец дат и столбец данных, я использую этот код, чтобы найти накопленную сумму данных для каждой из дат, которые содержатся в третьей колонке:функции в пределах accumarray

orgcumulative=cell2mat(accumarray(day,data,[],@(x){cumsum(x)})); 
k=orgcumulative==0; 
CVD=orgCVD; 
CVD(k)=[]; 

31,3,3 
31,2,5 
31,1,6 
31,5,11 
07,2,2 
07,3,4 
07,4,9 
07,2,11 
07,3,14 
07,5,19 
07,3,22 
07,1,23 
07,1,24 
07,2,26 
07,3,29 
30,5,5 
06,4,4 

Теперь я хочу разделить каждую точку данных в течение дня на сумму данных в этот день. Например:

31,3,3,3/11 
31,2,5,2/11 
31,1,6,1/11 
31,5,11,5/11 <-- 11 is the sum of data for the 31 date 
07,2,2,2/29 
07,3,4, %and so on... 
07,4,9, 
07,2,11, 
07,3,14, 
07,5,19, 
07,3,22, 
07,1,23, 
07,1,24, 
07,2,26, 
07,3,29, <-- 29 is the sum of data for the 07 date 
30,5,5,1 
06,4,4,1 

Если я пытаюсь:

fractions=cell2mat(accumarray(day,data,[],@(x){ data/sum(x) })); 

Это разделит весь второй столбец каждой из сумм. Есть ли способ ограничить это, так что деление происходит только для членов второго столбца в течение каждого дня?

ответ

1

Не было бы легче аккумулировать в общей сложности на каждый день, используя accumarray, а затем использовать day массив в качестве индекса при доступе к accumarray выхода, например, так:

total = accumarray(day, data); % equivalent to accumarray(day, data, [], @sum) 
fractions = data ./ total(day); 
+0

Благодаря тонну. Должен был подумать об этом! – siegel