Hi. I'am working on SVD++ algorithm for my course project and I've recently faced a huge bottleneck it the code which I am unable to solve by myself.
the code which consumes approximately 70% of time is:
for item=1:length(UserDataClear2)
Ys=Ys+ItemInfo{UserDataClear2{user}(item),4};
end
It does the following:
for each user there is a vector of items he rated (just numbers). It finds corresponding vector ItemInfo(x,4) where x stand for item's number (which i get from user profile, so set of items changes for each user).
I need to find a sum of all these vectors (ItemInfo(x,4)) - which seems to be the hardest part, as these vectors are stored in cell array.
Other variants such as
for item=1:length(UserDataClear2)
Ys{item}=ItemInfo{UserDataClear2{user}(item),4};
end
YsSum=sum(cat(2,Ys{:}),2)
work much slower.
In other words: I need to sum vectors from cell arrays, whereas vectors these vectors are different for each user; all of them are stored in huge cell array.
Any ideas how this code can be imporved?
Sincerely, Alex.

 Réponse acceptée

Andrew Newell
Andrew Newell le 7 Jan 2012

1 vote

The slowdown seems to be caused by the use of cell data for indices into ItemInfo. Try this:
Ys = sum([ItemInfo{UserDataClear2{user},4}])
This accesses the array UserDataClear2 only once.

2 commentaires

Alexey Zanin
Alexey Zanin le 7 Jan 2012
Brilliant and simple, thanks a lot!
The following code does summation allong the correct dimension of cell array:
Ys=sum([ItemInfo{UserDataClear2{user}(1:length(UserDataClear{user}(:,1))),4}],2);
Andrew Newell
Andrew Newell le 7 Jan 2012
Yikes!

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

Produits

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by