矢量化密度评估

时间:2015-04-21 20:34:52

标签: matlab

我想对以下循环进行矢量化:

k=4
n=5
w=randn(n,1)
theta = randn(n,k)
for i=1:size(theta,1)
    s = w(i)*mvnpdf(theta(i,:)',zeros(k,1),eye(k));
end

有什么建议吗? 感谢。

1 个答案:

答案 0 :(得分:2)

mvnpdf已经为第一个参数的每一行进行了矢量化。如果你有 N-by-D矩阵的第一个参数的行对应于观察或点,而列对应于变量或坐标,然后您可以使用矢量化,如下所示(假设w是列向量)。

news = w .* mvnpdf( theta', zeros(n,k), eye(k) );

theta的维度不是这样的,因此您需要使用cellfun来计算它,而不是使用循环。您需要我非常有用的自定义cols2cell.m function

k=4
n=5
w=randn(n,1)
theta = randn(n,k)
newtheta = theta';
for i=1:size(theta,1)
    s(i) = w(i) * mvnpdf(theta(i,:)',zeros(k,1),eye(k));
end

news = w .* cellfun( @(x) mvnpdf( x, zeros(k,1), eye(k) ), cols2cell( newtheta ) )';

可以定义您的函数以接收单元格列向量。 x是输入mvnpdf的第一个参数的列向量。

@(x) mvnpdf( x, zeros(k,1), eye(k) )

cellfun调用的结果是需要转置的行向量。之后,您可以使用w进行元素明智的乘法运算。结果证实是相同的。

>> s'
ans =
    0.0017
   -0.0065
   -0.0192
   -0.0010
    0.0005
>> news
news =
    0.0017
   -0.0065
   -0.0192
   -0.0010
    0.0005