Matlab - случайная прогулка с границами, векторизация
Предположим, у меня есть вектор J размеров прыжков и начальная начальная точка X_0. Также у меня есть границы 0, B (предположим, 0 < X_0 < Б). Я хочу сделать случайную прогулку, где X_i = [min (X_ {i-1} + J_i, B)] ^ +. (положительная часть). В основном, если он проходит через границу, он становится равным границе. Кто-нибудь знает векторизованный способ сделать это? Текущий способ, которым я делаю это, состоит в том, чтобы делать cumsums и затем находить места, где это нарушает условие, и затем начиная с этого и повторяя вычисление cumsum, и т.д., пока я не обнаружу, что я перестаю нарушать границы. Это работает, когда границы попадают редко, но если они попадают постоянно, это в основном становится циклом for.
В приведенном ниже коде я делаю это во многих примерах. Кисправить» те, которые выходят за границы, я должен пройтись по образцам, чтобы проверить ... (нене думаю, что есть векторизациянаходить')
% X_init is a row vector describing initial resource values to use for
% each sample
% J is matrix where each col is a sequence of Jumps (columns = sample #)
% In this code the jumps are subtracted, but same thing
X_intvl = repmat(X_init,NumJumps,1) - cumsum(J);
X = [X_init; X_intvl];
for sample = 1:NumSamples
k = find(or(X_intvl(:,sample) > B, X_intvl(:,sample) < 0),1);
while(~isempty(k))
change = X_intvl(k-1,sample) - X_intvl(k,sample);
X_intvl(k:end,sample) = X_intvl(k:end,sample)+change;
k = find(or(X_intvl(:,sample) > B, X_intvl(:,sample) < 0),1);
end
end