Как мне найти количество элементов между индексами?

#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:

Используя sparse и cumsum :

 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
...