Размеры этой проблемы: model.nlf = 4. Каждый {r} Куу или Куу Гамма - это 500 × 500 матриц данных.Избегание for-loops в матричных операциях с элементами ячеек
Как подавить цикл? моя интуиция идет на использование cellfun с функцией для logdet.
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
Благодарен за указатели. Спасибо
Следующий вопрос: Можно ли векторизовать следующие типы петель на элементах ячейки? 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
Чтобы ответить на ваш последующий вопрос: пожалуйста, перестаньте беспокоиться о векторизации! Как уже говорилось, ваш внутренний цикл состоит из вычислений на больших матрицах, которые Matlab уже делает как можно быстрее. Накладные расходы для небольшой петли совершенно ничтожны по сравнению с этим. Не тратьте время на оптимизацию кода, если профайлер говорит вам, что он работает медленно. –
Спасибо, Bas. Дело принято. Этот цикл отмечен красным, а не только розовым, профилировщиком, и именно поэтому я пытаюсь изменить эффективность программирования этих массивов ячеек. – user2015897
Вы должны видеть массивы ячеек, как крошечную матрицу указателей 4x16. Индексирование должно быть довольно быстрым. Что должно стоить время, так это вычисление матрицы 150x650. Но проверьте сами: разделите длинное выражение в своем for-loop на отдельные части: 'temp1 = model.Kuuinv {r}; temp2 = model.Kyu {k, r}; temp2 = temp2 '; temp3 = temp1 * temp2; model.KuuinvKuy {r, k} = temp3; ', каждый на отдельной строке и снова запустить профайлер. Если сюрпризов нет, большинство времени следует потратить на последнюю строку. В этом случае нет никакой надежды ускорить его, умножение матрицы должно быть супер-быстрым. –