Matlab: рассчитывать с одинаковой суммой на каждую дату и корректировать при изменении даты (для -l oop) - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть три вектора столбцов (300x1) Date, VariousA, Amount , и я хочу выполнить вычисление для каждой строки векторов моего столбца в зависимости от вектора datetime (Date). Если дата не меняется, сумма в расчете также не должна меняться. Если дата изменится, я хочу суммировать все результаты расчетов за предыдущую дату и прибавить сумму к сумме за предыдущую дату.

Следующий пример основан на таблице ниже:

Во-первых, Amount-Vector содержит значение только в первой строке ( 100 ). Расчет дает 60 . Так как дата в следующей строке остается прежней, сумма также остается неизменной - расчет дает 30 . Поскольку дата в строке 3 изменяется, я хочу изменить свою сумму. Сумма результатов за предыдущую дату составляет 90 , которая должна быть добавлена ​​к сумме предыдущей даты. Таким образом, новая сумма в строке 3 составляет 190 , и в результате расчета получается 85,5 , который необходимо добавить к 190 в следующей строке, поскольку дата в строке 4 снова меняется, и так далее ...

Надеюсь, это стало ясно. Кто-нибудь может помочь?

ОГРОМНОЕ СПАСИБО!

| Date          | VariousA  | Amount    | Result    | HelpColumn    |
|-------------  |---------- |--------   |--------   |-------------- |
| 28-Jul-2001   | 0.6       | 100       | 60        | 100*0.6       |
| 28-Jul-2001   | 0.3       | 100       | 30        | 100*0.3       |
| 29-Jul-2001   | 0.45      | 190       | 85.5      | 190*0.45      |
| 04-Aug-2001   | -0.7      | 275.5     | -192.5    | 275.5*(-0.7)  |
| 04-Aug-2001   | 0.1       | 275.5     | 27.55     | 275.5*0.1     |
| 05-Aug-2001   | 0.4       | 110.55    | 44.22     | 110.55*0.4    |

РЕДАКТИРОВАТЬ: Я понял этот кодекс, но он не работает вообще:

if     i>1 & Date(i)>Date(i-1) 
            Amount(i) = sum(Result(find(Date==Date(i-1)))) + Amount(i-1);
elseif i>1 & Date(i)==Date(i-1)    
            Amount(i) = Amount(i-1);
end  
Result(i)=VariousA(i)*Amount(i);

1 Ответ

1 голос
/ 29 апреля 2020

Я не совсем уверен, но это то, что вы ищете?

DateString = {'07/28/2001';'07/28/2001';'07/29/2001';'08/04/2001';'08/04/2001';'08/05/2001'};
formatIn = 'mm/dd/yyyy';
Date=datevec(DateString,formatIn);
VariousA=[0.6;0.3;0.45;-0.7;0.1;0.4];
Amount=[100;0;0;0;0;0];
Result=zeros(length(VariousA),1);

k=1;

for i=1:1:length(VariousA)
    if i>1
        Amount(i)=Amount(i-1);

        if sum(Date(i,:)>Date(i-1,:))>0
            for j=1:1:k
                Amount(i)=Amount(i)+Result(i-j);
            end
            k=1;
        else
            k=k+1;
        end
    end
    Result(i)=VariousA(i)*Amount(i);

end
...