数组操作 - 随机选择元素

时间:2015-09-09 15:26:37

标签: arrays matlab

假设我有一个长度为N的数组。我想随机选择n个位置,将它们设为零,然后将现有元素添加到下一个非零元素。

例如,假设r = (r1,r2,r3,r4,r5)N = 5。让n = 2。随机挑选的位置是第3和第4。然后我想将r转换为 r_new = (r1, r2, 0, 0, r3+r4+r5)

相反,如果随机选择的位置是13,那么我想拥有 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代码。伪代码就足够了。

2 个答案:

答案 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)

我假设最后一个位置永远不能被选中,否则预期的行为是未定义的。因此,您随机选择从n1均匀分布的N-1个位置(最多不到N)。

这是一种方法:

  1. n1选择N-1个不同的随机位置,然后对其进行排序。调用结果位置pos的向量。这可以通过randpermsort轻松完成。
  2. 对于pos中的每个值,例如p,将r(p)累积到r(p+1),并将r(p)设置为零。这是通过for循环完成的。
  3. 在步骤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
    
相关问题