这个问题的维度是:model.nlf = 4. Kuu或KuuGamma的每个{r}都是500x500的数据矩阵。
如何抑制for循环?我的直觉是使用具有logdet功能的cellfun。
logDetKuu = 0;
for r=1:model.nlf,
if isfield(model, 'gamma') && ~isempty(model.gamma)
[model.Kuuinv{r}, model.sqrtKuu{r}] = pdinv(model.KuuGamma{r});
model.logDetKuu{r} = logdet(model.KuuGamma{r}, model.sqrtKuu{r});
else
[model.Kuuinv{r}, model.sqrtKuu{r}] = pdinv(model.Kuu{r});
model.logDetKuu{r} = logdet(model.Kuu{r}, model.sqrtKuu{r});
end
logDetKuu = logDetKuu + model.logDetKuu{r};
end
感谢指针。感谢
后续问题:可以对单元格元素的以下类型的for循环进行矢量化吗? nlf = 4; nout = 16;每个KuuinvKuy {1,1}都是150x650
for k =1: model.nout,
for r =1: model.nlf,
model.KuuinvKuy{r,k} = model.Kuuinv{r}*model.Kyu{k,r}';
end
end
答案 0 :(得分:1)
如果你的所有矩阵都很大,并且你只执行了4次for循环,那么就没有理由去掉for循环,因为它不会导致任何加速。我唯一的观察是if
的条件似乎与循环无关,因此在循环之前移动if
更为清晰。像这样:
if isfield(model, 'gamma') && ~isempty(model.gamma)
myKuu = model.KuuGamma;
else
myKuu = model.Kuu;
end
logDetKuu = 0;
for r=1:model.nlf,
[model.Kuuinv{r}, model.sqrtKuu{r}] = pdinv(myKuu{r});
model.logDetKuu{r} = logdet(myKuu{r}, model.sqrtKuu{r});
logDetKuu = logDetKuu + model.logDetKuu{r};
end