假设我有一个长度为N
的数组。我想随机选择n
个位置,将它们设为零,然后将现有元素添加到下一个非零元素。
例如,假设r = (r1,r2,r3,r4,r5)
,N = 5
。让n = 2
。随机挑选的位置是第3和第4。然后我想将r
转换为
r_new = (r1, r2, 0, 0, r3+r4+r5)
。
相反,如果随机选择的位置是1
和3
,那么我想拥有
r_new = (0, r1 + r2, 0, r3+r4, r5)
。
我在MATLAB中编码。这是我目前的代码。
u = randperm(T);
ind = sort(u(1:n(i)));
tmp = r(ind);
r(ind) = 0;
x = find( r );
我不一定在寻找MATLAB代码。伪代码就足够了。
答案 0 :(得分:1)
假设已经生成了N,n和r,那么我们选择随机索引:
inds = randi(N,n,1);
然后,为了达到预期的效果,您可以按如下方式循环:
inds = sort(inds);
for ii=1:numel(inds)
if(inds(ii)<N)
r(inds(ii)+1)=r(inds(ii)+1) +r(inds(ii));
r(inds)=0;
else
r(inds)=0;
end
end
这将创建将值添加到未选择设置为0的下一个索引的所需结果。
注意我必须假设一个边缘情况,如果最后一个索引设置为0,那么它的值不会添加到任何东西。
答案 1 :(得分:1)
我假设最后一个位置永远不能被选中,否则预期的行为是未定义的。因此,您随机选择从n
到1
均匀分布的N-1
个位置(最多不到N
)。
这是一种方法:
n
到1
选择N-1
个不同的随机位置,然后对其进行排序。调用结果位置pos
的向量。这可以通过randperm
和sort
轻松完成。pos
中的每个值,例如p
,将r(p)
累积到r(p+1)
,并将r(p)
设置为零。这是通过for
循环完成的。在步骤2中,如果位置p+1
恰好也属于pos
,则累积值将在后续迭代中进一步向右移动。这是有效的,因为pos
已经排序,因此从左到右处理随机选择的位置。
r = [3 5 4 3 7 2 8]; %// data
n = 2; %// number of positions
pos = sort(randperm(numel(r)-1,n)); %// randomly select positions, and sort them
for p = pos
r([p p+1]) = [0 r(p)+r(p+1)]; %// process position p
end