Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 数组操作-随机选择元素_Arrays_Matlab - Fatal编程技术网

Arrays 数组操作-随机选择元素

Arrays 数组操作-随机选择元素,arrays,matlab,Arrays,Matlab,假设我有一个长度为N的数组。我想随机选择n位置,使它们为零,然后将现有元素添加到下一个非零元素 例如,假设r=(r1、r2、r3、r4、r5),N=5。让n=2。随机选择的位置是第三和第四。然后我想将r转换为 r\u 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)));

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

例如,假设
r=(r1、r2、r3、r4、r5)
N=5
。让
n=2
。随机选择的位置是第三和第四。然后我想将
r
转换为
r\u 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代码。伪代码将非常有用。

假设已经生成了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
inds=排序(inds);
对于ii=1:numel(inds)
如果(inds(ii)我假设最后一个位置永远不能被选择,否则预期的行为是未定义的。所以你随机选择
n
位置,从
1
n-1
(不到
n
)均匀分布

这里有一种方法:

  • 选择
    n
    1
    n-1
    的不同随机位置,并对它们进行排序。调用位置的结果向量
    pos
    。这可以通过和轻松完成
  • 对于
    pos
    中的每个值,说
    p
    ,将
    r(p)
    累加到
    r(p+1)
    ,然后将
    r(p)
    设置为零。这是通过循环完成的
  • 在步骤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
    

    randsample
    需要统计工具箱。对于普通的MATLAB采样,您可以使用类似于
    idx=0(n,1);while-length(unique(idx))
    的东西来确保获得唯一的整数值。@excaza…或者您可以使用
    randperm
    pos randperm(numel(r)-1,n)
    。好主意,谢谢!我将更改此选项以避免使用统计工具箱oops,duh,这是一个更干净的选项我得到了
    ??使用==>horzcat CAT参数时出错维度不一致。
    error@deb具体使用什么数据?如果
    randi
    多次返回相同的整数会发生什么情况?结果与在这种情况下,您只使用所选索引的唯一子集。在我看来,问题的要点似乎是关于对向量的期望更改,而不是关于生成唯一值,因为问题实际上并没有说明随机索引必须是唯一的