我想对以下循环进行矢量化:
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
有什么建议吗? 感谢。
答案 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