如何使用mvnpdf输入向量Matlab代码?

时间:2019-05-15 14:36:13

标签: matlab vectorization

我在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 :(得分:0)

是的,但是,我认为这不会给您带来巨大的性能提升。您将不得不重塑musigma的形状。

检查mvnpdf(X,mu,sigma)的文档,您将发现您必须提供Xmu作为 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