ジャンプサイズのベクトルJと初期開始点X_0があるとします。また、境界0、Bがあります(0 <X_0 <Bと仮定します)。X_i = [min(X_ {i-1} + J_i、B)]^+のランダムウォークを実行したい。(正の部分)。基本的に境界を越えると境界と等しくなります。誰もがこれを行うためのベクトル化された方法を知っていますか?現在のやり方は、cumsumを実行してから、条件に違反する場所を見つけ、そこから開始して、境界に違反しなくなるまで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