2013-11-02 85 views
-1

是否有任何準備好的命令從輸入中獲取預期的輸出?在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? 

回答

1

路易斯的回答的一個變體是內置nnz功能的使用方法:

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

如果你已經安裝了統計工具箱,可以減少到一個班輪這種使用randsample

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

注意:如果您想選擇隨機值(而不是其索引),請將find(a)替換爲nonzeros(a)(這是生成隨機索引然後執行a(rand_idx))。

+1

總是用最簡單的^ -^+1 – hhh

+0

@hhh我沒有徹底讀過這個問題的標題;我的解決方案從矢量'a'中選擇了一個隨機的非零*值*,而不是它的索引。不過,我已經修改它來做你想做的事情。 –

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指數)。

+0

它不會做這件事 - 注意我想獲取原始索引,而不是原始值。我希望它返回一些索引,其中相應的值是非零的 - 我想過循環和檢查非零,但在我的情況太多過熱。 – hhh

+0

明白了。查看更新後的答案 –

+0

謝謝,現在輕鬆閱讀^ -^+1歡迎光臨^!^ – hhh