-1

入力から意図した出力を取得する準備が整ったコマンドはありますか?

入力

>>> 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?
4

2 に答える 2

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) です。

于 2013-11-02T16:25:14.343 に答える
1

Luis の答えの変形は、組み込みnnz関数を使用することです。

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

Statistics Toolbox がインストールされている場合は、次を使用してこれをワンライナーに減らすことができますrandsample

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

注: (インデックスではなく) ランダムな値を選択する場合は、 (これは、ランダムなインデックスを生成してから実行するよりも短い方法です) にfind(a)置き換えnonzeros(a)ますa(rand_idx)

于 2013-11-03T10:57:58.950 に答える