Как векторизовать Matlab Code с помощью mvnpdf? - PullRequest
1 голос
/ 15 мая 2019

У меня есть некоторый рабочий код в Matlab, и скорость очень важна.У меня векторизация / оптимизация многих его частей, и теперь профилировщик говорит мне, что большую часть времени тратится на небольшой кусок кода.Для этого

  • У меня есть несколько наборов параметров для многовариантного нормального распределения .

  • Затем мне нужнополучить значение из соответствующего PDF в некоторой точке pos,

  • и умножить его на некоторое другое значение, сохраненное в векторе.

У меня естьниже приведен минимальный рабочий пример:

num_params = 1000;
prob_dist_params = repmat({ [1, 2], [10, 1; 1, 5] }, num_params, 1);
saved_nu  = rand( num_params, 1 );
saved_pos = rand( num_params, 2 );
saved_total = 0;
tic()
for param_counter = 1:size(prob_dist_params)
    % Evaluate the PDF at specified points
    pdf_vals = mvnpdf( saved_pos(param_counter,:), prob_dist_params{param_counter,1}, prob_dist_params{param_counter, 2} );
    saved_total = saved_total + saved_nu(param_counter)*pdf_vals;
end % End of looping over parameters
toc()

Я знаю, что prob_dist_params все одинаковы в этом случае, но в моем коде у нас каждый элемент отличается, в зависимости от нескольких вещей вверх по течению.Я называю этот фрагмент кода много десятков тысяч раз в моей полной программе, поэтому мне интересно, есть ли что-нибудь, что я могу сделать, чтобы векторизовать этот цикл , или, если это не удалось, ускорить егона всех ?Я не знаю, как это сделать с включением функции mvnpdf().

1 Ответ

0 голосов
/ 15 мая 2019

Да, вы можете, однако, я не думаю, что это даст вам огромный прирост производительности. Вам придется изменить свои mu и sigma.

Проверяя документ mvnpdf(X,mu,sigma), вы видите, что вам придется предоставить X и mu как n -by- d числовая матрица и sigma как d -by- d -by- n .

В вашем случае d равно 2, а n равно 1000. Вы должны разбить массив ячеек на две матрицы и изменить его следующим образом:

prob_dist_mu = cell2mat(prob_dist_params(:,1));
prob_dist_sigma = cell2mat(permute(prob_dist_params(:,2),[3 2 1]));

С permute я делаю первое измерение массива ячеек третьим измерением, поэтому cell2mat приведет к матрице 2 на 2 на 1000. В качестве альтернативы вы можете определить их следующим образом:

prob_dist_mu = repmat([1 2], [num_params 1]);
prob_dist_sigma = repmat([10, 1; 1, 5], [1 1 num_params]);

Теперь звоните mvnpdf с

pdf_vals = mvnpdf(saved_pos, prob_dist_mu, prob_dist_sigma);
saved_total = saved_nu.'*pdf_vals;     % simple dot product
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...