我在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()
函数。
答案 0 :(得分:0)
是的,但是,我认为这不会给您带来巨大的性能提升。您将不得不重塑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