使用单元格元素避免矩阵运算中的for循环

时间:2014-02-16 22:43:15

标签: matlab matrix cell elements operations

这个问题的维度是: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

1 个答案:

答案 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