2013-11-02 3 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 

Trials

>> 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))); 

Если у вас установлен Statistics Toolbox, вы можете уменьшить это в одну облицовке с помощью 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

Смежные вопросы