#matlab
#matlab
Вопрос:
У меня есть следующий массив максимумов цен на акции по неделям (каждый элемент относится к определенной неделе):
5.7627
6.0100
5.8198
5.8198
6.0671
6.0671
6.0100
5.5916
Мне нужно найти количество периодов с момента достижения 5-дневного максимума. Например, 5-дневный максимум выглядит следующим образом:
5.7627
6.0100
6.0100
6.0100
6.0671
6.0671
6.0671
6.0671
Для этого я использовал:
x = movmax(high,[n-1 0],'omitnan')
Однако я не знаю, как вычислить массив, который находит недели с момента появления этих цифр. Ожидаемый результат будет примерно таким:
0
0
1
2
0
1
2
3
4
...
Комментарии:
1. Похоже, что ваш вопрос не имеет отношения к проблеме… Можете ли вы уточнить? Кажется, вы хотите повторить элемент в массиве, пока не найдете элемент большего размера, затем вы повторяете новый элемент…
Ответ №1:
t = cumsum([true; diff(x)~=0]);
u = sparse(1:numel(high), t, true);
result = nonzeros(cumsum(u).*u)-1;
Используя accumarray
:
t = cumsum([true; diff(x)~=0]);
result = accumarray(t, t, [], @(u){(0:numel(u)-1).'});
result = cell2mat(result);
Использование неявного расширения (этот подход требует больше памяти, чем предыдущие, поскольку он строит промежуточную квадратную матрицу размером с данные):
t = cumsum([true; diff(x)~=0]);
result = sum(triu(t==t.')).'-1;
Ответ №2:
Почему бы не использовать просто старое доброе программирование?
price=[5.7627
6.0100
5.8198
5.8198
6.0671
6.0671
6.0100
5.5916];
M = price(1); % max in the list
M_ind = 1; % index where M happened
n_weeks = zeros(size(price)); % output
for k=2:numel(price)
if price(k) > M
M = price(k);
M_ind = k;
else
n_weeks(k) = k-M_ind;
end
end
disp(n_weeks)
выходы
0
0
1
2
0
1
2
3
...