Cell array summation

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.

 采纳的回答

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 个评论

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);

请先登录,再进行评论。

更多回答(0 个)

类别

帮助中心File Exchange 中查找有关 Matrix Indexing 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by