在Matlab中选择列表中随机非零元素的索引

时间:2013-11-02 16:15:16

标签: list matlab

是否有任何就绪命令从输入中获取预期输出?

输入

>>> a=[1 0 3 0 5 6 7 8 0 10 0 0]; selectNonZero(a)

预期输出

1 or 3 or 5 or 6 or 7 or 8 or 10

试验

>> b=a(a~=0); pi=randi([1, length(b)]); b(pi)    % The original index of b(pi)?

>> fix=[0 1 2 2 2 2 2]; pi+fix(pi)               % Fix changed index, cum command?

2 个答案:

答案 0 :(得分:3)

你可以这样做。它与您的方法类似,但使用find来了解非零值的索引。

jj = find(a~=0); % indices of nonzero values of a
ind = jj(randi(length(jj))); % randomly pick one of those indices
val = a(ind); % corresponding value of a

您想要的结果是sel(选定值)和ind(其索引在a内)。

答案 1 :(得分:1)

Luis回答的一个变体是使用内置的nnz函数:

idx = find(a);
rand_idx = idx(randi(nnz(a)));

如果您安装了统计工具箱,则可以使用randsample将其缩减为一行:

rand_idx = randsample(find(a), 1);

注意:如果要选择随机值(而不是其索引),请将find(a)替换为nonzeros(a)(这是生成随机索引然后执行{{1}的更短替代方法})。