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
多次返回相同的整数会发生什么情况?结果与在这种情况下,您只使用所选索引的唯一子集。在我看来,问题的要点似乎是关于对向量的期望更改,而不是关于生成唯一值,因为问题实际上并没有说明随机索引必须是唯一的