Ищите способ векторизовать команду find в Matlab - PullRequest
0 голосов
/ 22 февраля 2019

Я ищу более быстрый способ использования команды find без циклов, и ничто из того, что я нашел до сих пор, не помогло мне.Вот упрощенный пример того, что я пытаюсь сделать:

A = [0.1,0.8,1;
     0.3,0.7,1;
     0.2,0.3,1]; % this is a square matrix with cumulated sums of probabilities in its rows
row_sel = [2,3,2]; % this is a vector containing the rows of A that I am interested in
index = NaN(length(A),1);
for i = 1:length(A)
    index(i) = find(A(row_sel(i),:)>rand,1,'first'); % I want to get the index of the first column of row row_sel(i) whose element exceeds a random number
end

К сожалению, что-то вроде

index_mat = find(A(row_sel,:)>rand(length(A),1),1,'first')

не работает.Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Вы можете сравнить A с индексом row_sel_ с вектором столбца случайных значений, используя неявное расширение ;и затем используйте второй вывод max, который дает индекс максимального значения first вдоль указанного измерения:

[~, index] = max(A(row_sel,:) > rand(numel(row_sel),1), [], 2);

Для Matlab до R2016bне существует неявного расширения, но вы можете использовать bsxfun:

[~, index] = max(bsxfun(@gt, A(row_sel,:), rand(numel(row_sel),1)), [], 2);
0 голосов
/ 22 февраля 2019

Однострочник:

size(A, 2) + 1 - sum(A(row_sel, :) > rand(size(A, 1), 1), 2)

Пояснение

Как вы уже выяснили

A(row_sel, :) > rand(size(A, 1), 1)

дает вам желаемое сравнение междуваши значения и некоторые случайные числа.Допустим, это

ans =
    0  1  1
    0  0  1
    0  1  1

Тогда

sum(A(row_sel, :) > rand(size(A, 1), 1), 2)

подсчитывает вхождения 1с в результате на строку, поэтому здесь это

ans =
    2
    1
    2

Теперь давайтеполучить общее количество элементов в строке

size(A, 2)

Просто вычтите количество найденных единиц, и вы получите первый индекс для каждой строки.(Мы должны добавить 1, потому что мы хотим первое вхождение.)

size(A, 2) + 1 - sum(A(row_sel, :) > rand(size(A, 1), 1), 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...